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

时间:2015-01-15 01:58:00

标签: c pointers

#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

这是对的吗?如果没有,那么正确的陈述是什么?     * /

7 个答案:

答案 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

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

指针实际上只是一种特殊的数字 - 用于定位另一段数据的地址。在您的示例中,pa的数字地址,&p是指向p中存储的地址的指针。 &p是指向指针的指针。

答案 4 :(得分:0)

一张图片胜过千言万语,这就是记忆中的p和类似物。

左边是地址,右边是变量名。

            +---------------+      
  0028FF18  |   0028FF1C    |  p               
            +---------------+                  
  0028FF1C  |      2        |  a                
            +---------------+      

答案 5 :(得分:0)

在你的情况下,两者都是正确的!

如何轻松理解指针?

假设一个变量为一个带有标签(变量名称)的框,并且该框本身有一个地址(内存地址),例如Room 304 on 3楼,任何人找到它。在框中放置注释(值)会告诉您它是什么(int 3char '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
  • 的地址

结论

  1. 每个变量都有一个内存地址和一个值
  2. 正常变量只是直接处理其值
  3. 指针的值指向另一个地址(大多数时间,另一个变量的地址)。
  4. 上面的 Box模型也适用于int **p(指向指针的指针)等。

答案 6 :(得分:0)

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

int a = 5;
int *p = &a;
  • 5int变量a
  • &aint *变量p
  • *pint变量int *所占据的地址的p 值。