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

C 如果int*p是指向int的指针,为什么&p有**p类型?,c,pointers,C,Pointers,我已经阅读了很多关于指针的教程,并回答了很多关于指针的练习,包括阅读晦涩的声明、螺旋规则等 然而,有一件简单的事情我仍然不明白,我在任何地方都没有看到有人提到过 以INTP为例。 p是指向int的指针。 我知道我可以通过&p获得保存该指针的变量的地址。正当但是&p有int型*。。。为什么?这到底是什么意思?当然,它是指向int的指针,但我不理解它的含义 这个问题的动机是以下代码: int main() { node * curr, * root; int i; root =

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

然而,有一件简单的事情我仍然不明白,我在任何地方都没有看到有人提到过

以INTP为例。 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);
   }
编辑: 好的,我明白了&增加了另一个间接层次,我想知道为什么我没有在我读过的所有关于指针的文本中看到这一点,它们通常只告诉地址 .
我只是不明白这个指针是从哪里来的。例如,我想知道如果我没有创建它,它为什么会存在。如果我的问题不清楚,我真的很抱歉。我没想到会有这样的负面反应…

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

给定类型为foo的声明变量var,其地址&var的类型指针指向foo,或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公认的混乱类型语法非常有用。网站上有一个在线版本

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

区分指针值和指针对象变量很重要

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

非限定词指针的常见用法可能会令人困惑,尤其是当值和对象之间的区别很重要时,这里就是这样

有些人认为单词pointer应该只指指针对象,但事实上C标准使用单词来指指针值。例如,malloc的描述说

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


如果int i是int,为什么&i有int*类型?的每个地址都添加了另一个[指针]间接指向。不清楚你在问什么,因为你已经回答了自己的问题。指向int的指针保存指针的地址。使用指向int的指针可以更改原始指针指向的int。&p的类型为int**not**int或**与代码上下文和树和项的定义相对应。谢谢您的回答。第一行为我提供了新的信息;我想知道为什么到目前为止我读过的关于这些观点的文章都没有提到这一点。但是,复制我在原始问题中给出的评论:我只是不明白这几点从何而来。例如,我想知道如果我没有创建它,它为什么会存在。如果我的问题不清楚,我真的很抱歉。@user35477:我想你指的是指针,不是点。区分指针值和指针对象很重要。表达式&n生成一个指针值,即int*类型的值,但不创建该类型的对象。类似地,表达式42生成int类型的值,但除非创建int对象,否则该值不会存储在int对象中。现在我明白了。这回答了我的问题。非常感谢你。你可以用这些新信息编辑你的答案吗?这样我就可以接受了?
int a[10]; // a has type int[10], &a has type int(*)[10]
typedef int arr10[10]; // arr10 is an alias for the type int[10]
arr10 a;               // a has type arr10, &a has type arr10*