本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 一维数组
答案4/8的意思是32位机器上显示4,64位机器上显示8
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//数组名a单独放在sizeof内部,计算的整个数组的大小,单位是字节,4*4 = 16
printf("%d\n", sizeof(a + 0));//a表示的首元素的地址,a+0还是数组首元素的地址,是地址大小4/8(32位机器上显示4,64位机器上显示8)
printf("%d\n", sizeof(*a));//a表示的首元素的地址,*a就是对首元素的地址的解引用,就是首元素,大小是4个字节
printf("%d\n", sizeof(a + 1));//a表示的首元素的地址,a+1是第二个元素的地址,是地址,大小就4/8个字节
printf("%d\n", sizeof(a[1]));//a[1]是数组的第二个元素,大小是4个字节
printf("%d\n", sizeof(&a)); //&a 表示是数组的地址,数组的地址也是地址,地址大小就是4/8字节
printf("%d\n", sizeof(*&a));//可以理解为*和&抵消效果,*&a相当于a,sizeof(a)是16
//&a -> int(*)[4]
//&a是数组的地址,它的类型是int(*)[4]数组指针,如果解引用,访问的就是4个int的数组,大小是16个字节
printf("%d\n", sizeof(&a + 1));//&a是数组的地址,&a+1 跳过整个数组后的地址,是地址就是4/8
printf("%d\n", sizeof(&a[0]));//&a[0]取出数组第一个元素的地址,是地址就是4/8
printf("%d\n", sizeof(&a[0] + 1));//&a[0]+1就是第二个元素的地址,是地址大小就是4/8个字节
2. 二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));//数组名单独放在sizeof内部,计算的是整个数组的大小48
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//a[0]表示第一行的数组名,a[0]作为数组名单独放在sizeof内部,计算的是第一行的大小16
printf("%d\n",sizeof(a[0]+1));//a[0]作为第一行的数组名,没有&,没有单独放在sizeof内部,a[0]表示首元素地址,即a[0][0]的地址,a[0]+1就是第一行第二个元素的地址,是地址就是4/8
printf("%d\n",sizeof(*(a[0]+1)));//第一行第二个元素,大小是4
printf("%d\n",sizeof(a+1));//a是二维数组的数组名,没有&,没有单独放在sizeof内部,a表示首元素的地址,即第一行的地址,a+1就是第二行的地址,是类型为int(*)[4]的数组指针,是地址就是4/8
printf("%d\n",sizeof(*(a+1)));//*(a+1)就是第二行,相当于第二行的数组名,*(a+1)->a[1],相当于计算第二行的大小,是16字节printf("%d\n",sizeof(&a[0]+1));//&a[0]是第一行的地址,&a[0]+1是第二行的地址,是地址就是4/8
printf("%d\n",sizeof(*(&a[0]+1)));//*(&a[0]+1)就是第二行,也就是a[1],相当于计算第二行的大小,是16字节
printf("%d\n",sizeof(*a));//a二维数组数组名,没有&,没有单独放在sizeof内部,a表示首元素的地址,即第一行的地址*a表示第一行a[0],大小是16字节
printf("%d\n",sizeof(a[3]));//感觉a[3]越界了,但是没关系,sizeof实际上算的是类型大小,大小是16字节
总结: 数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。