#include<stdio.h>
int main()
{
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));//48 3*4*4
printf("%d\n", sizeof(a[0][0]));//4
printf("%d\n", sizeof(a[0]));//16 a[0]相当于第一行做为一维数组的数组名,
//sizeof(arr[0])把数组名单独放在sizeof()内,计算的是一行的大小
printf("%d\n", sizeof(a[0]+1));//4 a[0]是第一行的数组名,数组名此时是首元素的地址,其实就是第一行第一个元素的地址
//所以a[0]+1就是第一行第二个元素的地址:地址是4/8个字节
printf("%d\n", sizeof(*(a[0] + 1)));//4 *(a[0]+1)是第一行第二个元素,大小是4个字节
printf("%d\n", sizeof(a+1));//4 a是二维数组的数组名,没有sizeof(a),也没有&(a),所以a是首元素地址
//而把二维数组看成一维数组时,二维数组的首元素就是他的第一行,a就是第一行的(首元素)的地址
//a+1就是第二行的地址
printf("%d\n", sizeof(*(a+1)));//16 sizeof(*(a+1))==sizeof(a[1]) 计算第二行的大小,单位字节
printf("%d\n", sizeof(&a[0]+1));//4 &a[0]第一行的地址 &a[0]+1 就是第二行的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//16 计算第二行的大小 单位字节
printf("%d\n", sizeof(*a));//16 a是首元素地址 - 第一行的地址,sizeof(*a)就是计算第一行的大小
printf("%d\n", sizeof(a[3]));//16
return 0;
}
运行结果
其实二维数组有没有想象的那么难,把二维数组看成多个一维数组去理解就可以了
希望可以帮助到有需要和不理解的人