数组名本身就是地址
#一维数组:
int array[4] = {0};
printf ("%p\n", &array[0]); // 数组首无素地址, 单位是 4 字节
printf("%p\n", array); //array是数组名, 同时也是数组首元素地址, 单位是 4 字节
printf ("%p\n", &array); //数组的地址, 单位是一个数组, 20 字节
#二维数组
int a[3][4]={0};
printf("%p\n", &a[0][0]); //首元素的地址, 单位 4 字节
printf("%p\n", a[0]); //首行首元素的地址, 单位 4 字节
printf("%p\n", &a[0]); //首行的地址, 单位 12 字节
printf("%p\n", a); //首行的地址, 单位 12 字节
printf("%p\n", &a); //数组的地址, 单位 48 字节
printf("%p %p\n", a[1], *(a + 1)); // a[x]===== *(a + x)
数组a[3][4] 哪个不能表示a[1][1]?
*(a[1] + 1) √ // a[1]是第二行首元素的地址, +1是第二行第二个元素的地址
*(&a[1][1]) √ // &a[1][1]是第二行第二个元素的地址, * 取值
(*(a + 1))[1] √ // *[a + 1] = a[1]
*(a + 5) × // a是首行的地址, a + 1 超出范围
*(*a + 5) √ // *a是首行首元素的地址, +5是第二行第二个地址, * 取值