指针是指向内存中某个位置的变量。
int *pointer1;
int *pointer2 = pointer1;
假设两个变量都指向内存位置
0xA
然后我执行
pointer2++;
现在,pointer2
指向
0xB
因为两个地址都指向同一个地方,所以我完全希望pointer1
指向
0xB
但事实并非如此。 pointer1
仍然指向0xA
。
这怎么可能?指针是否有另一个地址来指定它实际上是哪个指针?如果是,那么第二个地址叫什么?
答案 0 :(得分:6)
您将指针中存储的值与指针指向的值混淆。
这两个指针本身是完全独立的,它们碰巧指向相同的内存位置。当你写
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
都有一个存储地址,与其他变量一样;为清晰起见,图中未显示这一点。
答案 1 :(得分:2)
指针虽然具有特殊的特征,但却是数字。在这方面,就好像pointer1
和pointer2
是整数,恰好具有相同的值。如果你增加一个,你就不会自动增加另一个。
答案 2 :(得分:2)
pointer1
是一个包含int *
类型值的对象
pointer2
是另一个包含int *
类型值的对象。
如果您更改pointer2
中包含的值,则没有理由认为pointer1
中的值也会发生变化。任何其他类型的值都会发生完全相同的事情。例如,使用double
double a = 4.2;
double b = a;
b /= 10;
/* is `a` now 4.2, or 0.42?? */
答案 3 :(得分:0)
在行int *pointer2 = pointer1;
中,您将存储在pointer1的地址复制到pointer2。两者都是自变量。如果要更新存储在pointer1到pointer2的地址,则需要一个指针指针:
int **pointer2 = &pointer1;
(*pointer2)++;