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;