Как назначить void * pointer1 для void * pointer2? Столкнувшись с некоторой проблемой - PullRequest
2 голосов
/ 22 марта 2010
void* ptr1 = NULL;
void* ptr2 = ptr1;
unsigned int *buf = data;//some buffer

//now
ptr2 = buf + 8;

Вышеуказанное изменение адреса ptr2 не отражается в ptr1.Я тоже пытаюсь void* ptr2 = &ptr1;.

Пожалуйста, дайте мне знать, в чем здесь ошибка.

Ответы [ 5 ]

7 голосов
/ 22 марта 2010

Почему ptr1 следует за ptr2?

Если вы хотите, чтобы ptr1 имел тот же адрес, что и ptr2, вы должны установить его в ptr2:

ptr1 = ptr2;

В вашем посте ptr1 все еще указывает на NULL. Так что вам нужно явно указать это, чтобы указать на ptr2.

Рисование картинок делает все более понятным, так что пойдите:

альтернативный текст http://img705.imageshack.us/img705/2433/pointers.png

Прямо сейчас у вас есть 2 указателя, указывающие на некоторые данные или нет данных (NULL). Если вы хотите, чтобы указатель следовал за другим указателем, вам нужен указатель на указатель (2 звездочки), а не просто указатель (1 звездочка).

void** ptr1  = (void**) &ptr2;
4 голосов
/ 22 марта 2010

Вот что происходит:

This is what happens

4 голосов
/ 22 марта 2010

Если вы хотите, чтобы ptr1 следовал за ptr2:

void* ptr2 = NULL;
void** ptr1 = (void **)&ptr2;
unsigned int *buf = data;//some buffer

//now
ptr2 = buf + 8;

Теперь * ptr1 следует за ptr2

4 голосов
/ 22 марта 2010

Указатель указывает на объект. Изменение указателя означает, что он должен указывать в другом месте. Он не изменяет указанный объект и не влияет на любой другой указатель на этот объект.

Здесь у вас есть ptr1 и ptr2, которые являются независимыми переменными, каждая из которых содержит значение указателя. Если вы хотите, чтобы изменения одного отражались на другом, то на самом деле вам не нужны две независимые переменные, вам нужна только одна, и используйте ее несколько раз.

2 голосов
/ 22 марта 2010

Вы должны вручную обновить ptr1 - это переменная, совершенно не связанная с ptr2, и они изменяют значения независимо.

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