|
楼主 |
发表于 2020-1-6 00:47:00
|
显示全部楼层
好的,我结合最近看的书和视频以及您的回复仔细想了想,我好想明白了,我再描述一下我理解的,您帮我看看有没有错:
为了说明清楚我举个例子
int a[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}};
1、其实这个二维数组就是三个一维数组a[0],a[1],a[2]组成,且a[0],a[1],a[2]也是对应一维数组的函数名,因此就可以套用一维数组的知识:数组的函数名等于数组首元素的地址,综上在数值上a==a[0]==&a[0][0],这个相等仅仅上是地址的数值是一样的,他们的类型是不同。为什么类型不同呢?因为这个可以从他们的对应地址+1的值可以看出来,大小不同。
如以下代码运行可以知道:
printf("a=%p\n", a);
printf("a+1=%p\n", a+1);
printf("&a=%p\n", &a);
printf("&a+1=%p\n", &a+1);
printf("&a[0]=%p\n", &a[0]);
printf("&a[0]+1=%p\n", &a[0]+1);
printf("&a[0][0]=%p\n", &a[0][0]);
printf("&a[0][0]+1=%p\n", &a[0][0]+1);
这段代码就说明了您说的“array 和 &array[0][0]只是值相等,类型并不相同 而array和&array[0],他们的类型才是相同的。” 我从本质上来理解就是a[0]是一维数组的指针,他有四个int类型的元素,相当于是一个数组指针,所以一个指针的长度就是4*4=16字节。而&a[0][0]只是一个int类型元素的指针,指针大小是4字节。a[0]也是一维数组的数组名,他仅仅等于一维数组首元素的地址,即a[0]==&a[0][0],要想让获得一维数组的指针则是&a[0].
所以以上啰嗦了一大堆其实就是 数组名和数组地址和数组首元素地址,这三个数值上一样,类型不一样,不要搞混了。
2.由上可知,a==&a[0], ∴*a==*&a[0] 即*a==a[0],
同理, a+i==&(a+i), ∴*(a+i)==*&a[i] 即*(a+i)==a[i],
|
|