为什么这个程序有意外的指针值?

时间:2015-10-06 21:39:59

标签: c pointers

我写这篇文章是为了测试我对指针的了解:

int main (){
  int seven = 7;
  int* p = &seven;
  int** pp = &p;
  int*** ppp = &pp;
  printf("%d %d %d %d\n", *ppp, &pp, &p, &seven);
}

然而,在输出中,我得到:

1363848032 1363848024 1363848032 1363848044

这对我来说不直观,因为*ppp == &p

我期待*ppp == &pp。为什么会这样? &pp是否遵循指向p

的指针

4 个答案:

答案 0 :(得分:3)

我将尝试使用以下架构解释问题:

  ppp     pp       p    seven      <---- variable names
+----+  +----+  +----+  +----+
| 30 |  | 20 |  | 10 |  |  7 |     <---- memory contents
+----+  +----+  +----+  +----+
  40      30      20      10       <---- memory addresses

在上图中,方框表示存储变量的各个内存插槽。每个框下面的数字是该地方在内存中的地址。

现在指针实际上只是一个变量,其值是恰好是某个其他变量的内存地址的数字。 因此,当您说*ppp时,您要求地址30的变量值等于20,即p的地址。所以你得到*ppp == &pppp == &pp

答案 1 :(得分:1)

int*** ppp = &pp;

那你为什么期望*ppp == &pp? (注意额外的*取消引用)

答案 2 :(得分:1)

你想做这样的事吗?

#include <stdio.h>

int main (){
  int seven = 7;
  int* p = &seven;
  int** pp = &p;
  int*** ppp = &pp;

  printf("%d %d \n", *p, seven);
  printf("%d %d \n", **pp, seven);
  printf("%d %d \n", ***ppp, seven);


  printf("%p %p \n", p, &seven);
  printf("%p %p \n", pp, &p);
  printf("%p %p \n", ppp, &pp);
  printf("%p %p \n", *ppp, pp);

}


        $ ./ptr 
        7 7 
        7 7 
        7 7 
       0x7ffe4dce54b4 0x7ffe4dce54b4 
       0x7ffe4dce54a8 0x7ffe4dce54a8 
       0x7ffe4dce54a0 0x7ffe4dce54a0 
       0x7ffe4dce54a8 0x7ffe4dce54a8 

答案 3 :(得分:1)

这是一个简单的方法:箱子和箱子号码。您可以将各种数字放入框中,包括框号。

在你的例子中:

7放入一个框(变量seven),其框号为&seven

然后您创建一个新框(变量p)以保留7的框号(&seven),其框编号为{{1 }}

稍后你也会这样做,依此类推。

&p包含ppp的框编号,该编号用于保存pp的框号,而该编号又创建为保留{{1} &#39;盒号。

p