sizeof是面试笔试中一个常见的考点,这里总结一下关于sizeof的知识。
一、sizeof概念
sizeof不是函数,而是操作符。该操作符在C++中的优先级为3,比* 、/、%运算的优先级高,和负号、正号、取地址、指针等运算符同一级别。
sizeof的返回值为size_t,在头文件中被定义为unsigned int类型。
sizeof的作用是返回系统分配的内存空间,单位是字节。该过程是在编译过程中完成的,因此可以使用sizeof(x)来定义数组维数。
二、sizeof用法
(1)使用类型做参数
sizeof使用类型做参数时,必须用括号将参数括起来。如sizeof(int)、sizeof(double)等。
(2)使用变量做参数
因为sizeof是操作符,所以可以直接使用变量做参数,而不需要括号,不过在编写程序时还是将括号带上,这样更清晰。
int a; sizeof a和sizeof(a)都是合法的。
(3)使用函数做参数
sizeof可以使用函数做参数,这时候必须使用括号。返回值为函数返回值所占用的内存空间。
short f();
printf("%d\n",sizeof(f()));
等同于输出sizeof(short)。
(4)使用数组做参数
由于是在编译过程中确定的值,因此计算的是编译器为数组分配的内存空间。
char str[100]="12345";
int a[10]={1,2};
char str2[]="12345";
int b[]={1,2};
sizeof(str)返回100,sizeof(a)返回10*4=40,sizeof(str2)返回6,sizeof(b)返回8。
(5)使用指针做参数
返回指针所占用的内存空间,一般是4个字节。
char *str="0123456789",sizeof(str)=4。sizeof(*str)计算的是指针指向的对象,为数组的第一个字符,返回1。
(6)使用union做参数
返回最大成员的内存大小
(7)使用结构体做参数
这个考察的内容多,参见http://blog.csdn.net/szchtx/article/details/8801583
(2)使用类做参数
参见http://blog.csdn.net/szchtx/article/details/10254007
(9)sizeof不能用于函数类型、不完全类型或位字段,因为它们的大小在编译期间不确定。
三、sizeof的主要用途
(1)与存储分配和I/O系统进行通信,如:
void *malloc(size_t size);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
(2)查看某类型的对象所占内存空间
void *memset(void *s, int c, sizeof(s));
参考自:http://blog.sina.com.cn/s/blog_5da08c340100bmwu.html
《程序员面试宝典》
The End——