c/c ++:二维数组变量下标

Shi*_*pta 1 c c++

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?

Jos*_*eld 5

  1. &a为您提供数组的地址.这是类型int (*)[3][3].简单.

  2. a表示数组本身,并将进行数组到指针的转换,成为指向数组第一个元素的指针.数组的第一个元素是类型的子数组int[3],因此我们得到一个指向该子数组的指针.这个指针是类型的int (*)[3].它具有与以前相同的地址,因为第一个子阵列位于数组的开头.

  3. 使用时*a,数组再次进行数组到指针的转换,以获得与之前一样的指向子数组的指针.然后取消引用以获得子阵列本身.然后,表示子阵列的表达式也经历了数组到指针的转换,为您提供指向第一个元素的指针.第一个元素是类型int,因此指针是类型int*.第一个元素的地址与它所属的子数组的地址相同,正如我们所见,它与整个数组的地址相同.

  4. &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)

这些区域都从相同的地址开始,因此指针具有相同的值.