鉴于数组的名称实际上是指向数组第一个元素的指针,请使用以下代码:
#include <stdio.h>
int main(void)
{
int a[3] = {0, 1, 2};
int *p;
p = a;
printf("%d\n", p[1]);
return 0;
}
按预期打印1
。
现在,鉴于我可以创建指向指针的指针,我写了以下内容:
#include <stdio.h>
int main(void)
{
int *p0;
int **p1;
int (*p2)[3];
int a[3] = {0, 1, 2};
p0 = a;
p1 = &a;
p2 = &a;
printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",
p0[1], (*p1)[1], (*p2)[1]);
return 0;
}
我希望它能够编译和打印
p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1
但相反,它在编译时出错,说:
test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]
为什么这个任务错了?如果p1
是指向int
的指针,a
是指向int
的指针(因为它是int
的数组的名称),为什么我不能将&a
分配给p1
?
答案 0 :(得分:16)
第11行
p1 = &a;
其中p1
的类型为int **
而a
的类型为int[3]
,对吧?
好; &a
类型为int(*)[3]
,且该类型与编译器告诉您的int**
不兼容
您可能想尝试
p1 = &p0;
阅读the c-faq,特别是第6节。
简而言之:数组不是指针,指针不是数组。
答案 1 :(得分:6)
a
不是指向int
的指针,它在某些情况下衰减。如果&a
类型为int **
,则您无法很好地使用它来初始化p2
,是吗?
你需要p1 = &p0;
来获得你想要的效果。 “指向指针”意味着“在这个地址,你会找到一个指针”。但是如果你查看地址&a
,你会发现一个数组(显然),所以int **
不是正确的类型。
答案 2 :(得分:0)
对于许多操作,a
隐含&a
并且都返回相同的内容:数组中第一个项的地址。
您无法获取指针的地址,因为该变量不存储指针。 a
不是指针,即使它在某些情况下表现得像。