#include<stdio.h>
main() {
int a,*p;
a=2;
p = &a;
printf("The address %p contains the address of a=2:%pn",&p,p);
printf("The address of %d is %pn",a,&a);
return 0;
}
结果是:
The address 0028FF18
包含a=2: 0028FF1C
的地址
这是正确的吗?如果不是,正确的陈述是什么?
2 的地址是 0028FF1C
这是正确的吗?如果不是,正确的陈述是什么? */
有自己的地址 &p,但 p 的值是 a 的地址。
关于:
printf("The value of a is %d.", a); // The value of a is 2.
printf("The address of a is %p.", &a); // The address of a is 0028FF1C
关于p:
printf("The value of p is the address of a is %p.", p); // The value of p is the address of a is 0028FF1C
printf("The address of p is %p.", &p); // The address of p is 0028FF18
我认为计算机上的内存是一条充满地址的街道(一条很长的街道),每个地址都有一个值。变量a
和p
只是我们程序员构想这些内存位置所需的语法。因此,a
是地址 0028FF1C 的表示形式,该地址的当前居民是 2 ...将来,2个可以搬出,4个可以搬进,但地址是相同的。
p
也是如此 - 他的地址将始终是 0028FF18,碰巧a
的地址是该位置的当前居民,但后来不同的值可以移动到这里(例如,p = &b
),p
的地址仍然是 0028FF18。
请看下图:
+---------+
| |
| 2 | Value of a=2
| |
+---------+
Address=0028FF1C
+---------+
| |
|0028FF1C | P stores address of a
| | So p=0028FF1C
+---------+
Address=0028FF18
所以现在你的第一个问题是
1. The address 0028FF18 contains the address of a=2: 0028FF1C. Is this correct?
答:是的,这是正确的,因为 0028FF18 是 p 的地址,它包含 &a,即 a 的地址是 0028FF1C。
现在来回答第二个问题
2. The address of 2 is 0028FF1C. Is this correct?
答:这有点令人困惑(不能说它是完全正确的),因为 a 的地址是 0028FF1C,a 的值是 2。因此,如果您像这样打印它可能会更好:
printf("The address of a is %pn",&a);
所以它会给出输出:
a 的地址是 0028FF1C。
这个语句似乎更好,因为在这里我们打印的是变量的地址,而不是该变量存储的值的地址。
实际上只是一种特殊的数字——用于定位另一条数据的地址。在您的示例中,p
是要a
的数字地址,&p
是指向存储在 p
中的地址的指针。 &p
是指向指针的指针。
一张图片胜过千言万语,这是记忆中的 p 和 a 喜欢。
左边是地址,右边是变量名。
+---------------+
0028FF18 | 0028FF1C | p
+---------------+
0028FF1C | 2 | a
+---------------+
在你的情况下,两者都是正确的!
如何轻松理解指针?
想象一下,一个变量是一个带有标签(变量名称)的盒子,盒子本身有一个地址(内存地址),比如三楼的304室,任何人都可以找到它。在盒子里放了一个注释(值)告诉你它是什么(一个int 3
,一个char 's'
,一个float 3.14
等)。
指针也是一个框,除了它包含一个带有另一个框地址的注释。
你如何阅读int
?
它如何在可变int a=2
上工作?
你只是说,嘿,我想访问a
(上面有标签 a 的盒子),有人(你的编译器和操作系统)只是找到这个盒子并把它给你。您打开框,看到一个便笺,上面写着2
(不妨键入 int
)。你可以用你刚刚潦草的另一个笔记来更改它,比如3
。
你如何阅读int *
?
同样,假设我们有int *p = a
.我们得到带有标签p
的盒子,打开它,上面写着Room 305 on 5th floor
.因此,这次我们不是说"我想要盒子a
",而是说"把盒子带到5楼305室"(这就是*p
的意思)。
-
*p = 3;
的意思是:将p
指向的框带到的框,并将其值更改为 3。 -
int *q = &a
:带一个新盒子(放在某个地方),并用一张纸条填满,上面写着a
地址 -
&p
:给我盒子p
的地址
结论
- 每个变量都有一个内存地址和一个值
- 普通变量只是直接处理其值
- 指针的值指向另一个地址(大多数情况下,另一个变量的地址)。
- 上面的盒子模型也适用于
int **p
(指针到指针)等。
也许一个简单的类比会帮助你更好地理解。
int a = 5;
int *p = &a;
-
5
是int
变量a
的值。 -
&a
是变量p
int *
的值。 -
*p
是变量p
持有的地址处int
值int *
。