c语言指针问题?

求大佬帮忙,急急急!
刚学的二维数组,但是书上的跟我们学的不太一样,现直接懵了
这里看不懂了,为什么a,*a a[0],&a[0]结果一样啊,按理说不应该一个是地址,一个是地址值吗
能详细一点吗,我完全是萌新级别的

#include<stdio.h>

int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a)); //16 a表示数组的首元素,首地址.因此用sizeof计算它们的值,就是整个二维数组所占用的内存空间
printf("%d\n",sizeof(*a)); //4 首元素大小 就相当于 sizeof(*a)=4 =sizeof(a[0]);
//*a表示:首先,a对应的存储单元中的数据一定是另一个存储单元的地址。
printf("%d\n",sizeof(&a)); //4 &a为数组地址和a即a[0]的地址一样
printf("%d\n",sizeof(&a[0])); //4 首元素地址
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-07-07
一位数组名就是数组存储的头指针,二维数组名也是同样的头指针
a是二维数组名,就是这个首地址
*a是一位数组名,还是这个首地址
a[0] = *a
&a[0] = a

所以都一样的追问

*a不应该是一维数组表示的具体的数吗

我明天早上再看一下,主要不懂为啥a[0]=*a

追答

一位数组 也一样 a[0] = *a 啊,语义都是取数组的第一个元素

本回答被提问者采纳
第2个回答  2020-07-07
a[0] == *(a+0) == *a
&a[0] == &(*(a+0)) == &(*(a+0+0*0)) == &a[0][0] == &(*a) == a
这里输出的应该是a的值,是个地址。这个a是个二级指针。
所以*a=a[0]=a
想输出a[0][0]的值应该写成**a。
以上是我的想法,其实我也是个萌新
第3个回答  2020-07-07
你运行结果已经表明是一样的地址了
以运行结果为准(如果书上和运行结果不一样)
第4个回答  2020-07-07
书上的跟我们学的不太一样,现直接懵
相似回答