Как я могу визуализировать концепцию постинкрементного указателя? - PullRequest
4 голосов
/ 28 апреля 2011

Указатель - это переменная, которая указывает на место в памяти.

int *pointer1;
int *pointer2 = pointer1;

Допустим, обе переменные указывают на область памяти

0xA

Затем я выполняю

pointer2++;

Теперь pointer2 указывает на

0xB

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

0xB

Но это не так.pointer1 все еще указывает на 0xA.

Как это возможно?Есть ли у указателя другой адрес, чтобы указать, какой именно это указатель?Если да, как называется этот второй адрес?

Ответы [ 4 ]

6 голосов
/ 28 апреля 2011

Вы путаете значение, сохраненное в указателе, со значением, на которое указывает указатель.

Два указателя, по сути, полностью независимы, они просто указывают на одну и ту же область памяти. Когда ты пишешь

pointer2++;

вы увеличиваете значение , хранящееся в pointer2 (то есть адрес, на который он указывает), а не значение, сохраненное в указанном местоположении; Будучи pointer и pointer2 независимыми переменными, нет никаких причин, по которым pointer также должен изменять свое значение.

<ч />

Более наглядно:

int var=42;
int * ptr1 = &var;
int * ptr2 = ptr2;

Предположим, что var хранится в ячейке памяти 0x10, у нас будет такая ситуация:

+----------+
|          |  0x00
+----------+
|          |  0x04
+----------+                      
|          |  0x08               +------------+
+----------+              +------| ptr1: 0x10 |
|          |  0x0C        |      +------------+
+----------+              |      +------------+
| var: 42  |  0x10   <----+------| ptr2: 0x10 |
+----------+                     +------------+
|          |  0x14      
+----------+
|          |  0x18
+----------+
|          |

Теперь мы увеличиваем ptr2

ptr2++;

(из-за арифметики с указателями сохраненный адрес увеличивается на sizeof(int), что здесь мы предполагаем равным 4)

+----------+
|          |  0x00
+----------+
|          |  0x04
+----------+                      
|          |  0x08               +------------+
+----------+              +------| ptr1: 0x10 |
|          |  0x0C        |      +------------+
+----------+              |      +------------+
| var: 42  |  0x10   <----+   +--| ptr2: 0x14 |
+----------+                  |  +------------+
|          |  0x14   <--------+
+----------+
|          |  0x18
+----------+
|          |

Теперь ptr2 указывает на 0x14 (что здесь не важно в этом примере); ptr1 остается нетронутым, указывая на 0x10.

(естественно, у ptr1 и ptr2 есть адрес, где они хранятся, как и у любой другой переменной; это не показано на диаграммах для ясности)

2 голосов
/ 28 апреля 2011

pointer1 - это объект, который содержит значения типа int *.
pointer2 - это еще один объект, который также содержит значения типа int *.

Если вы измените значение, содержащееся в pointer2, нет никаких оснований полагать, что значение в pointer1 также изменится. То же самое происходит со значениями любого другого типа. Например, с double

double a = 4.2;
double b = a;
b /= 10;
/* is `a` now 4.2, or 0.42?? */
2 голосов
/ 28 апреля 2011

Указатели, хотя и имеют особые характеристики, являются числами. В этом отношении, как если бы pointer1 и pointer2 были целыми числами, которые просто имели одно и то же значение. Если вы увеличиваете одно, вы автоматически не увеличиваете другое.

0 голосов
/ 28 апреля 2011

В строке int *pointer2 = pointer1; вы копируете адрес, сохраненный в pointer1 в pointer2.Оба являются независимыми переменными.Если вы хотите обновить адрес, сохраненный от указателя 1 до указателя 2, вам понадобится указатель указателя:

int **pointer2 = &pointer1;
(*pointer2)++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...