指针是指向内存中某个位置的变量.
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.
这怎么可能?指针是否有另一个地址来指定它实际上是哪个指针?如果是,那么第二个地址叫什么?
您将指针中存储的值与指针指向的值混淆.
这两个指针本身是完全独立的,它们恰好指向相同的内存位置.当你写作
pointer2++;
Run Code Online (Sandbox Code Playgroud)
你正在增加存储pointer2的值(即它指向的地址),而不是存储在指向位置的值; 存在pointer和pointer2自变量,没有理由也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.
(自然都ptr1和ptr2具有其中它们被存储,因为任何其它变量的地址;这没有在为清楚起见图中示出)