sizeof()到底是什么?
每当人们在一段代码中看到**sizeof()**时,许多人总是会认为这是一个库自带的函数,那它真就是一个函数吗?我们首先来看一下比较官方的解释:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.
那 sizeof到底是什么?
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
其返回值类型为size_t,在头文件<stdio.h>中定义
所以请记住:sizeof为操作数,而且是单目操作数,它并不是一个函数。
我们来看一下sizeof有哪些不为人知的小秘密
1.sizeof后需不需要加小括号()?
1.当sizeof的操作数是类型时必须加括号();
#include <stdio.h>
int main(){
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(double));
}
而当sizeof的操作数是常量时,可以不用加小括号();
printf("%d\n",sizeof 'a');
char c = '\n';
printf("%d\n",sizeof c);
2.当sizeof的操作数是表达式时,需要加括号();
1 #include <stdio.h>
2
3 int main(){
4 printf("%d\n",sizeof 'a'+'a');
5 printf("%d\n",sizeof('a'+'a'));
6 return 0;
7 }
我们发现当操作数为表达式且不加括号时,则直接sizeof直接返回’a’的字节,而且是以整型int 的形式,再加上后面’a’代表的97,最终结果为101。而当加了括号后结果就明显不同了。
2.sizeof只会关心返回表达式的结果的类型,并不会计算表达式。
1 #include <stdio.h>
2
3 int main(){
4 int a=0,b=0;
5 printf("%d\n",sizeof(++a+ ++b));
6 printf("%d\n%d\n",a,b);
7 return 0;
8 }
3.当sizeof后面的操作数为单独的字符或者字符运算时,编译时系统会把这个字符看成int整型,小数浮点型默认为double类型,但是如果是经过定义的char型或者float型 变量,则返回该类型的字节大小。
1 #include <stdio.h>
2
3 int main(){
4 printf("%d\n",sizeof 'c');
5 printf("%d\n",sizeof('a'+'a'));
6 char s = 'a';
7 printf("%d\n",sizeof s);
8 printf("%d\n",sizeof(s+'a'));
9 float f = 3.14;
10 printf("%d\n",sizeof 3.14);
11 printf("%d\n",sizeof f);
12 printf("%d\n",sizeof 4ll);
13 return 0;
14 }
直接在常量后面加ll,f等也可以改变数据的类型。
4.如果sizeof后面的操作数是多类型的表达式时,则返回的结果是最宽字节类型的字节
1 #include <stdio.h>
2
3 int main(){
4 char c='a';
5 printf("%d\n",sizeof c);
6 printf("%d\n",sizeof 4);
7 printf("%d\n",sizeof(c+5+4.5));
8 return 0;
9 }
5.如果sizeof后面的操作数为函数时
1.如果函数不带小括号(),则返回的结果始终为 1
2.如果函数名有小括号(),则返回结果等于函数返回值类型的字节宽度
1 #include <stdio.h>
2
3 short school(){
4 return 5;
5 }
6 char character(){
7
8 return 'c';
9 }
10 int integer(){
11 return 5;
12 }
13 double doub(){
14 return 3.14;
15 }
16 int main(){
17
18 printf("%d\n",sizeof(school));
19 printf("%d\n",sizeof(school()));
20 printf("%d\n",sizeof(character));
21 printf("%d\n",sizeof(character()));
22 printf("%d\n",sizeof(integer));
23 printf("%d\n",sizeof(integer()));
24 printf("%d\n",sizeof(doub));
25 printf("%d\n",sizeof(doub()));
26 return 0;
27 }
6.当sizeof的操作数为指针时,其返回的结果恒为4;
1 #include <stdio.h>
2
3 int main(){
4 printf("%d\n",sizeof(int*));
5 printf("%d\n",sizeof(char*));
6 printf("%d\n",sizeof(double**));
7 int a = 0;
8 char c = 'a';
9 double d = 3.14;
10 printf("%d\n",sizeof &a);
11 printf("%d\n",sizeof &c);
12 printf("%d\n",sizeof &d);
13 return 0;
14 }