C语言 指针地址与指针包含的地址之间的差异


#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,但 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

我认为计算机上的内存是一条充满地址的街道(一条很长的街道),每个地址都有一个值。变量ap只是我们程序员构想这些内存位置所需的语法。因此,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的地址

结论

  1. 每个变量都有一个内存地址和一个值
  2. 普通变量只是直接处理其值
  3. 指针的值指向另一个地址(大多数情况下,另一个变量的地址)。
  4. 上面的盒子模型也适用于int **p(指针到指针)等。

也许一个简单的类比会帮助你更好地理解。

int a = 5;
int *p = &a;
  • 5int变量a的值
  • &a是变量p int *的值
  • *p 是变量 p 持有的地址处intint *

最新更新