1.sizeof的说明
sizeof在C语言里面属于操作符,不属于函数,和变量的++,–属于同样的操作符。sizeof后面的括号里面,可以放类型名,数组名等内存大小确定的类型,不能计算函数名,可变数组的内存大小等
1.一维数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
main()
{
int a[] = {1,2,3,4}; 结果
printf("%d\n",sizeof(a)); 16
printf("%d\n",sizeof(a+0)); 4
printf("%d\n",sizeof(*a)); 4
printf("%d\n",sizeof(a+1)); 4
printf("%d\n",sizeof(a[1])); 4
printf("%d\n",sizeof(&a)); 4
printf("%d\n",sizeof(&a+1)); 4
printf("%d\n",sizeof(&a[0])); 4
printf("%d\n",sizeof(&a[0]+1)); 4
system("pause");
return 0;
}
a代表数组的起始地址,也就是数组a的0号位元素的内存起始地址,a+0代表指针a偏移0,因此指向的还是数组的起始地址,所以a=&a=a+0=&a[0],虽然他们的数值相等,都表示数组起始地址,但他们的意义不同。
2.二维数组
int main()
{
int a[3][4] = {0}; 结果
printf("%d\n",sizeof(a)); 48
printf("%d\n",sizeof(a[0][0])); 4
printf("%d\n",sizeof(a[0])); 16
printf("%d\n",sizeof(a[0]+1)); 4
printf("%d\n",sizeof(a+1)); 4
printf("%d\n",sizeof(&a[0]+1)); 4
printf("%d\n",sizeof(*a)); 16
printf("%d\n",sizeof(a[3])); 16
system("pause");
return 0;
}
a代表了二维数组的起始地址,&a在内存上和a表示的是同一个地方,还是二维数组的起始地址,因此用sizeof计算它们的值,就是整个二维数组所占用的内存空间。那么,a,a[0],a+0,&a[0],&a[0][0],(a+0),这些都代表什么呢?我们可以用下面这个图来描述二维数组a:
sizeof(a)表示整个二维数组的大小,a表示(a+0),所以,*a表示一维数组的首地址,因此sizeof(a)是4sizeof(int)为16;
a[0]也就是*(a+0),和a一样,也是指向一维数组的首地址,因此a[0],(a+0)用sizeof计算内存大小,就是4*sizeof(int)为16;
&a[0]就是&((a+0)),&和互相抵消,因此相当于a+0,数组名参与了指针偏移运算,因此sizeof(&a[0])的大小为指针的内存大小,是4字节。&a[0][0]就是&((a+0)+0)),&和抵消以后,为(a+0)+0,(a+0)代表一维数组的首地址,因此(a+0)+0表示数组首地址参与偏移操作,成为指向数组{1,3,5,7}0号位元素1的指针,sizeof(&a[0][0])的大小4 ;
我们总结为一句话,不论是一维数组,还是二维数组,如果直接
sizeof数组名,那么大小为整个数组所占用的内存空间,如果计算类似a+0,a+1等数组名进行了偏移运算,那么它就代表指向某个元素的指针,sizeof计算的话,其大小为指针的内存大小