C: замена указателей в массиве - PullRequest
5 голосов
/ 19 января 2010

У меня есть массив, который содержит указатели.Как правильно поменять местами два указателя - скажем, массив [1] и массив [4]?

Ответы [ 5 ]

5 голосов
/ 19 января 2010
void* temp = array[1]; 
array[1] = array[4]; 
array[4] = temp;
5 голосов
/ 19 января 2010

Вам нужна временная переменная:

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

Редактировать Исправлена ​​первая строка.

3 голосов
/ 19 января 2010

Самый правильный способ - использовать временную переменную, как в:

void *tmp_pointer;

....
tmp_pointer = array[1];
array[1] = array[4];
array[4] = tmp_pointer;
....

Держитесь подальше от любого злого бита или хаков! :)

Позвольте мне добавить, что мы должны были спросить " какой тип указателя? "

Теоретически, вы не можете безопасно смешивать указатели с данными и указатели для работы. Стандарт C не гарантирует, что это будет иметь смысл или возможно вообще. Это только гарантирует, что:

  • указатели данных могут быть преобразованы обратно и из void *
  • ((void *) 0) - указатель, который отличается от любого указателя данных или указателя функции
  • функциональные указатели одного типа могут быть преобразованы в функциональные указатели другого типа и обратно.

Я понимаю, что это связано с тем, что в некоторых архитектурах адресное пространство для данных полностью отделено от адресного пространства для функций, и вы не можете безопасно преобразовывать указатели одного типа в другой и обратно.

1 голос
/ 19 января 2010
#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]));
}

Намного понятнее и временно сохраняет.; -)

0 голосов
/ 19 января 2010

Мой C довольно ржавый, но простого

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

должно хватить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...