如何可视化后递增指针的概念?

P.B*_*key 4 c pointers

指针是指向内存中某个位置的变量.

int *pointer1;
int *pointer2 = pointer1;
Run Code Online (Sandbox Code Playgroud)

假设两个变量都指向内存位置

0xA
Run Code Online (Sandbox Code Playgroud)

然后我表演

pointer2++;
Run Code Online (Sandbox Code Playgroud)

现在,pointer2指向

0xB
Run Code Online (Sandbox Code Playgroud)

因为两个地址都指向同一个地方,所以我完全期望pointer1指出

0xB
Run Code Online (Sandbox Code Playgroud)

但事实并非如此. pointer1仍然指向0xA.

这怎么可能?指针是否有另一个地址来指定它实际上是哪个指针?如果是,那么第二个地址叫什么?

Mat*_*lia 6

您将指针中存储的值与指针指向的值混淆.

这两个指针本身是完全独立的,它们恰好指向相同的内存位置.当你写作

pointer2++;
Run Code Online (Sandbox Code Playgroud)

你正在增加存储pointer2的值(即它指向的地址),而不是存储在指向位置的值; 存在pointerpointer2自变量,没有理由也pointer应该改变它的价值.


更加图形化:

int var=42;
int * ptr1 = &var;
int * ptr2 = ptr2;
Run Code Online (Sandbox Code Playgroud)

假设var存储在内存位置0x10,我们将遇到这种情况:

+----------+
|          |  0x00
+----------+
|          |  0x04
+----------+                      
|          |  0x08               +------------+
+----------+              +------| ptr1: 0x10 |
|          |  0x0C        |      +------------+
+----------+              |      +------------+
| var: 42  |  0x10   <----+------| ptr2: 0x10 |
+----------+                     +------------+
|          |  0x14      
+----------+
|          |  0x18
+----------+
|          |
Run Code Online (Sandbox Code Playgroud)

现在我们增加ptr2

ptr2++;
Run Code Online (Sandbox Code Playgroud)

(由于指针运算,存储的地址增加了sizeof(int),这里我们假设为4)

+----------+
|          |  0x00
+----------+
|          |  0x04
+----------+                      
|          |  0x08               +------------+
+----------+              +------| ptr1: 0x10 |
|          |  0x0C        |      +------------+
+----------+              |      +------------+
| var: 42  |  0x10   <----+   +--| ptr2: 0x14 |
+----------+                  |  +------------+
|          |  0x14   <--------+
+----------+
|          |  0x18
+----------+
|          |
Run Code Online (Sandbox Code Playgroud)

现在ptr2指向0x14(在这个例子中有什么不重要); ptr1保持不变,指向0x10.

(自然都ptr1ptr2具有其中它们被存储,因为任何其它变量的地址;这没有在为清楚起见图中示出)