如果int * p是指向int的指针,为什么& p的类型为** p?

时间:2014-09-08 22:28:46

标签: c pointers

我已经阅读了很多关于指针的教程,我确实回答了很多关于它们的练习,包括阅读晦涩的声明,螺旋规则等等。

然而,有一件简单的事情我仍然无法获得,而且我在任何地方都没有被提及。

考虑int p。 p是指向int的指针。 我知道我可以使用& p获取保存此指针的变量的地址。对。但是& p的类型为int * ...为什么?它究竟意味着什么? (当然,它是指向int的指针,但我不明白这种感觉)

这个问题的动机来自以下代码:

int main() {
   node * curr, * root;
   int i;

   root = NULL;

   for(i=1;i<=10;i++) {
      curr = (node *)malloc(sizeof(node));
      curr->left = curr->right = NULL;
      curr->val = rand();
      insert(&root, curr);
   }

和电话

insert(&(*tree)->right, item);

编辑: 好的,我得到了&amp;增加了另一层次的间接(我想知道为什么我还没有看到所有文本中提到的这一点,我已经读过指针,他们通常只是告诉地址) 。 我只是不明白这个指针的来源。例如,我想知道为什么它存在,如果我没有创建它。如果我的问题不明确,我真的很抱歉。我没有预料到这种负面反应......

2 个答案:

答案 0 :(得分:1)

给定类型为var的声明变量foo,其地址&var的类型为“指向foo”,或foo*

foo var; // var has type foo, &var has type foo*

在您的情况下,变量的类型恰好是指针类型。这没什么区别。

int n;  // n has type int,  &n has type int*
int *p; // p has type int*, &p has type int**

对于某些类型,特别是数组类型,您可能必须添加括号来表示地址的类型:

int a[10]; // a has type int[10], &a has type int(*)[10]

这仍然是同一个想法;你只需要额外的括号来避免语法模糊。如果这太混乱了,你可以隐藏一个typedef背后的数组类型(通常一个好主意):

typedef int arr10[10]; // arr10 is an alias for the type int[10]
arr10 a;               // a has type arr10, &a has type arr10*

程序cdecl对于解码C公认的令人困惑的类型语法非常有用。在http://cdecl.org/

有一个在线版本
  

我只是不明白这个指针的来源。我想知道为什么它存在,如果我没有创建它,例如。

区分指针和指针对象(变量)非常重要。

表达式&n产生指针值(类型int*的值),但不创建该类型的对象。同样,表达式42会生成类型int的值,但除非您创建一个值,否则该值不会存储在int对象中。

非限定词“指针”的常见用法可能令人困惑,特别是当值和对象之间的区别很重要时,就像在这里一样。

有些人认为“指针”这个词应该只指一个指针 object ,但实际上C标准使用这个词来指代指针值。例如,malloc()的说明就是

  

malloc 函数返回空指针或指向已分配空间的指针。

答案 1 :(得分:0)

它是指针的地址。地址指向指向int的指针。