#include<stdio.h>
main() {
int a,*p;
a=2;
p = &a;
printf("The address %p contains the address of a=2:%p\n",&p,p);
printf("The address of %d is %p\n",a,&a);
return 0;
}
结果是:
的地址
The address 0028FF18
包含a=2: 0028FF1C
这是对的吗?如果没有,那么正确的陈述是什么?
地址2是0028FF1C
这是对的吗?如果没有,那么正确的陈述是什么? * /
答案 0 :(得分:1)
p有自己的地址,即&amp; p,但p的值是a的地址。
答案 1 :(得分:1)
关于:
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 :(得分:1)
请看下图:
+---------+
| |
| 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的地址,它包含&amp; a,即地址为0028FF1C。
现在提出第二个问题
2. The address of 2 is 0028FF1C. Is this correct?
答案:这是一个有点混乱的陈述(不能说它完全正确),因为a的地址是0028FF1C,a的值是2.所以它可能是如果你打印它会更好:
printf("The address of a is %p\n",&a);
所以它会给出输出:
a的地址是0028FF1C。
这句话看起来更好,因为我们打印变量的地址而不是该变量存储的值的地址。
答案 3 :(得分:0)
指针实际上只是一种特殊的数字 - 用于定位另一段数据的地址。在您的示例中,p
是a
的数字地址,&p
是指向p
中存储的地址的指针。 &p
是指向指针的指针。
答案 4 :(得分:0)
一张图片胜过千言万语,这就是记忆中的p和类似物。
左边是地址,右边是变量名。
+---------------+
0028FF18 | 0028FF1C | p
+---------------+
0028FF1C | 2 | a
+---------------+
答案 5 :(得分:0)
在你的情况下,两者都是正确的!
假设一个变量为一个带有标签(变量名称)的框,并且该框本身有一个地址(内存地址),例如Room 304 on 3楼,任何人找到它。在框中放置注释(值)会告诉您它是什么(int 3
,char 's'
,float 3.14
等等。
虽然指针也是一个盒子,但它包含一个带有另一个盒子地址的注释。
int
?它如何对变量int a=2
起作用?
你只是说,嘿,我想访问a
(标签上有一个标签的框),有人(你的编译器和操作系统)只是找到了这个框并交给你。您打开该框,看到一条读取2
的注释(可能还要输入int
)。你可以用另一个你刚写过的笔记来改变它,比如3
。
int *
?同样地,我们说int *p = a
。我们在其上打开带有标签p
的框,打开它,然后显示Room 305 on 5th floor
。因此,我不想说a
&#39;我想要方框*p
&#39;,这次我们说'将文件夹放在5楼的305室&#39;({{1} }意味着)。
*p = 3;
表示:带上p
个框指向的框,并将其值更改为3. int *q = &a
:带一个新盒子(放在某个地方),然后填写一张便条,上面写着a
的地址&p
:告诉我方框p
int **p
(指向指针的指针)等。答案 6 :(得分:0)
也许一个简单的比喻会帮助你更好地理解。
int a = 5;
int *p = &a;
5
是int
变量a
的值。&a
是int *
变量p
的值。*p
是int
变量int *
所占据的地址的p
值。