指向指针和指向数组的指针之间的区别?

鉴于数组的名称实际上是指向数组的第一个元素的指针,以下代码:

#include  int main(void) { int a[3] = {0, 1, 2}; int *p; p = a; printf("%d\n", p[1]); return 0; } 

按预期打印1

现在,鉴于我可以创建一个指向指针的指针,我写了以下内容:

 #include  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

第11行是

  p1 = &a; 

其中p1类型为int **a类型为int[3] ,对吧?

好; &a具有类型int(*)[3]并且该类型与编译器告诉您的int**不兼容

你可能想试试

  p1 = &p0; 

并阅读c-faq ,特别是第6节。

简而言之: 数组不是指针指针不是数组

a不是指向int的指针,它在某些情况下会衰减 。 如果&aint **类型,你不能很好地用它来初始化p2 ,是吗?

你需要做p1 = &p0; 为了你想要的效果。 “指针指针”意味着“在这个地址,你会找到一个指针”。 但是如果你看一下地址&a ,你会找到一个数组(显然),所以int **不是正确的类型。

对于许多操作, a implies &a都返回相同的东西:数组中第一个项的地址。

您无法获取指针的地址,因为该变量不存储指针。 a不是指针,即使它在某些情况下表现得像一个。