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

时间:2011-04-27 21:28:06

标签: c pointers

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

int *pointer1;
int *pointer2 = pointer1;

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

0xA

然后我执行

pointer2++;

现在,pointer2指向

0xB

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

0xB

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

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

4 个答案:

答案 0 :(得分:6)

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

这两个指针本身是完全独立的,它们碰巧指向相同的内存位置。当你写

pointer2++;

您正在递增存储在pointer2 中的值(即它指向的地址),而不是存储在指定位置的值;由于pointerpointer2是自变量,因此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。

(当然,ptr1ptr2都有一个存储地址,与其他变量一样;为清晰起见,图中未显示这一点。

答案 1 :(得分:2)

指针虽然具有特殊的特征,但却是数字。在这方面,就好像pointer1pointer2是整数,恰好具有相同的值。如果你增加一个,你就不会自动增加另一个。

答案 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)++;