C 指针到指针和指针到数组之间的区别?

C 指针到指针和指针到数组之间的区别?,c,arrays,pointers,declaration,dereference,C,Arrays,Pointers,Declaration,Dereference,假设数组的名称实际上是指向数组第一个元素的指针,则以下代码: #include <stdio.h> int main(void) { int a[3] = {0, 1, 2}; int *p; p = a; printf("%d\n", p[1]); return 0; } 我希望它能够编译和打印 p0[1] = 1 (*p1)[1] = 1 (*p2)[1] = 1 但相反,它在编译时出错,说: test.c: In functi

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

#include <stdio.h>

int main(void)
{
    int a[3] = {0, 1, 2};
    int *p;

    p = a;

    printf("%d\n", p[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

用于许多操作,
a
表示
&a
,两者都返回相同的内容:数组中第一项的地址

无法获取指针的地址,因为变量未存储指针<代码>a不是指针,即使在某些情况下它的行为类似于指针。

第11行是指针

        p1 = &a;
其中,
p1
具有类型
int**
a
具有类型
int[3]
,对吗

嗯,<代码>&a具有类型
int(*)[3]
,并且该类型与编译器告诉您的
int**
不兼容

你可能想试试

        p1 = &p0;
阅读,特别是第6节


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

a
不是指向
int
的指针,在某些情况下会衰减为这样。如果
&a
int**
类型,您不能很好地使用它来初始化
p2
,可以吗


您需要执行
p1=&p0以获得所需的效果。“指针指向指针”的意思是“在这个地址,你会找到一个指针”。但是如果你查看地址
&a
,你会发现一个数组(显然),因此
int**
不是正确的类型。

那么,如果不是
a
的第一个元素的地址(这将是我要找的指针)a
就是一个数组。它存储实际的数组元素。数组的名称在传递给函数时衰减为指向第一个元素的指针,但这并不意味着数组被实现为指向某个区域的指针<代码>INTA[3]本身没有指针,只有三个
int
s。非常感谢!你的评论让我的想法更进一步@因为
&a
的类型是
int(*)[3]
而不是
int**
。不
a
在很多方面并不意味着
&a
。它意味着
&一个[0]
!这颠覆了我所知道的关于数组和指针的一切。我真的很奇怪这么多年来我是怎么逃脱的。谢谢你讲清楚了。@jpmelos-数组和指针的工作方式出人意料地微妙,在学习C的早期不是很容易弄清楚的。很高兴你明白了。你侥幸逃脱了,因为数组常常表现为指针,指针表现为数组。。。但是他们不一样!阅读第6节:它真的很有趣:)前一段时间我写了一封信,你可能会喜欢。
        p1 = &p0;