Вы путаете значение, сохраненное в указателе, со значением, на которое указывает указатель.
Два указателя, по сути, полностью независимы, они просто указывают на одну и ту же область памяти. Когда ты пишешь
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
есть адрес, где они хранятся, как и у любой другой переменной; это не показано на диаграммах для ясности)