5 votes

C : permutation des pointeurs dans un tableau

J'ai un tableau qui contient des pointeurs. Comment puis-je échanger deux pointeurs - disons array[1] et array[4] - correctement ?

5voto

martinr Points 2152

Vous avez besoin d'une variable temporaire :

void*temp = array[4];
array[4]=array[1];
array[1] = temp;

Editer Corriger la première ligne.

5voto

Tony Points 5945
void* temp = array[1]; 
array[1] = array[4]; 
array[4] = temp;

3voto

Remo.D Points 9841

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.

1voto

Richard Pennington Points 12912
#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 ;-)

0voto

dbemerlin Points 6257

Mon C est assez rouillé, mais un simple

int* foo = array[4];
array[4] = array[1];
array[1] = foo;

devrait suffire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X