J'ai un tableau qui contient des pointeurs. Comment puis-je échanger deux pointeurs - disons array[1] et array[4] - correctement ?
Réponses
Trop de publicités?La manière la plus correcte est d'utiliser une variable temporaire comme dans :
void *tmp_pointer;
....
tmp_pointer = array[1];
array[1] = array[4];
array[4] = tmp_pointer;
....
Restez à l'écart des mauvais bits ou des int hacks :)
J'ajoute ici que nous aurions dû demander " quel type de pointeur ? "
En théorie, vous ne pouvez pas mélanger sans risque les pointeurs vers les données et les pointeurs vers les fonctions. La norme C ne garantit pas que cela ait un sens ou soit possible du tout. Elle garantit seulement que :
- les pointeurs de données peuvent être convertis de et vers
void *
- ((void *)0) est un pointeur qui est différent de tout pointeur de données ou de fonction.
- les pointeurs de fonction d'un type peuvent être convertis en pointeurs de fonction d'un autre type et inversement.
Je comprends que c'est parce que dans certaines architectures, l'espace d'adressage des données est complètement séparé de l'espace d'adressage des fonctions et qu'il est impossible de convertir en toute sécurité un type de pointeur en un autre et inversement.
#include <stdint.h>
if (1 != 4) {
array[1] = (void*)((intptr_t)(array[1]) ^ (intptr_t)(array[4]));
array[4] = (void*)((intptr_t)(array[1]) ^ (intptr_t)(array[4]));
array[1] = (void*)((intptr_t)(array[1]) ^ (intptr_t)(array[4]));
}
C'est beaucoup plus clair et cela permet d'économiser un temporaire ;-)