int a[3][3]={5};
printf("&a = %u \n a = %u \n*a = %u\n&a[0][0]=%d\na[0][0]", &a, a, *a, &a[0][0], a[0][0]);
Run Code Online (Sandbox Code Playgroud)
输出: -
&a = 2359028
a = 2359028
*a = 2359028
&a[0][0]=2359028
a[0][0] =5
Run Code Online (Sandbox Code Playgroud)
这些怎么可能都一样?如果a = 2359028的值,那么不应该*a在地址2359028给出值,即5?
&a为您提供数组的地址.这是类型int (*)[3][3].简单.
a表示数组本身,并将进行数组到指针的转换,成为指向数组第一个元素的指针.数组的第一个元素是类型的子数组int[3],因此我们得到一个指向该子数组的指针.这个指针是类型的int (*)[3].它具有与以前相同的地址,因为第一个子阵列位于数组的开头.
使用时*a,数组再次进行数组到指针的转换,以获得与之前一样的指向子数组的指针.然后取消引用以获得子阵列本身.然后,表示子阵列的表达式也经历了数组到指针的转换,为您提供指向其第一个元素的指针.第一个元素是类型int,因此指针是类型int*.第一个元素的地址与它所属的子数组的地址相同,正如我们所见,它与整个数组的地址相同.
&a[0][0]首先获取第一个子数组的第一个元素,然后获取它的地址.这将为您提供与上一点完全相同的指针.
因此,所有这些指针都具有相同的值.
图解:
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
???????????????????????????????????????????????????????
? int ? int ? int ? int ? int ? int ? int ? int ? int ?
???????????????????????????????????????????????????????
???????????????????????????????????????????????????????
&a points at the entire array
???????????????????
a gives you a pointer to the first subarray
???????
*a gives you a pointer to the element 0,0
and so does &a[0][0]
Run Code Online (Sandbox Code Playgroud)
这些区域都从相同的地址开始,因此指针具有相同的值.