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

C 如何将指针递增后的概念可视化?,c,pointers,C,Pointers,指针是指向内存中某个位置的变量 int *pointer1; int *pointer2 = pointer1; 假设这两个变量都指向内存位置 0xA 然后我表演 pointer2++; 现在,pointer2指向 0xB 因为两个地址都指向同一个地方,所以我完全希望pointer1指向同一个地方 0xB 但事实并非如此指针1仍然指向0xA 这怎么可能?指针是否有另一个地址来指定它实际上是哪个指针?如果是,第二个地址叫什么?指针虽然有特殊的特征,但都是数字。在这方面,就好像pointe

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

int *pointer1;
int *pointer2 = pointer1;
假设这两个变量都指向内存位置

0xA
然后我表演

pointer2++;
现在,
pointer2
指向

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

0xB
但事实并非如此<代码>指针1仍然指向
0xA


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

指针虽然有特殊的特征,但都是数字。在这方面,就好像
pointer1
pointer2
是整数,正好有相同的值。如果增加一个,则不会自动增加另一个。

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

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

pointer2++;
您增加的是存储在
指针2中的值(即它指向的地址),而不是存储在指定位置的值;作为
指针
指针2
自变量,没有理由
指针
也应该更改其值


更形象地说:

int var=42;
int * ptr1 = &var;
int * ptr2 = ptr2;
假设
var
存储在内存位置0x10,我们将遇到以下情况:

+----------+
|          |  0x00
+----------+
|          |  0x04
+----------+                      
|          |  0x08               +------------+
+----------+              +------| ptr1: 0x10 |
|          |  0x0C        |      +------------+
+----------+              |      +------------+
| var: 42  |  0x10   <----+------| ptr2: 0x10 |
+----------+                     +------------+
|          |  0x14      
+----------+
|          |  0x18
+----------+
|          |
(由于指针运算,存储的地址增加了
sizeof(int)
,这里我们假设为4)

+----------+
|| 0x00
+----------+
|| 0x04
+----------+                      
|| 0x08+------------+
+----------++----ptr1:0x10|
|| 0x0C |+------------+
+----------+              |      +------------+

|var:42 | 0x10
pointer1
是一个包含
int*
类型值的对象
pointer2
是另一个也包含
int*
类型值的对象

如果更改
指针2
中包含的值,则没有理由认为
指针1
中的值也会更改。任何其他类型的值都会发生完全相同的情况。例如,使用
double

double a = 4.2;
double b = a;
b /= 10;
/* is `a` now 4.2, or 0.42?? */

int*pointer2=pointer1您正在将存储在指针1的地址复制到指针2。两者都是自变量。如果要更新存储在指针1到指针2的地址,则需要指针的指针:

int **pointer2 = &pointer1;
(*pointer2)++;

对于第二个和第三个问题:是的,指针1的地址叫做&pointer1。
double a = 4.2;
double b = a;
b /= 10;
/* is `a` now 4.2, or 0.42?? */
int **pointer2 = &pointer1;
(*pointer2)++;