我已经阅读了很多关于指针的教程,我确实回答了很多关于它们的练习,包括阅读晦涩的声明,螺旋规则等等。
然而,有一件简单的事情我仍然无法获得,而且我在任何地方都没有被提及。
考虑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;增加了另一层次的间接(我想知道为什么我还没有看到所有文本中提到的这一点,我已经读过指针,他们通常只是告诉地址) 。 我只是不明白这个指针的来源。例如,我想知道为什么它存在,如果我没有创建它。如果我的问题不明确,我真的很抱歉。我没有预料到这种负面反应......
答案 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的指针。