sizeof是关键字不是函数,就算不知道它是否为32 个关键字之一时,我们也可以借助编译器确定它的身份。来看看下面几种情况:
A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;
32位系统下:
首先很明显A、B都是4.那么C和D呢?
我们用Visual C++6.0或者其他编译器来试下:
C报错syntax error : ‘type’
但是D输出结果也是4.
sizeof后面没有括号也是可以的,但是函数后面是不能没有括号的,所以sizeof绝不是函数。
不是说sizeof 是个关键字,其后面的括号可以没有么?那你想想sizeof int 表示什么啊?int 前面加一个关键字?类型扩展?明显不正确,我们可以在int 前加unsigned,const 等关键字但不能加sizeof。好,记住:sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。一般情况下,咱也别偷这个懒,乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字”。
接下来我们来看看下面这几个表达式的值:(32位系统下)
int *p = NULL; //这里不要写成Null,或者null
sizeof(p)是多少?
sizeof(*p)是多少?
解答:
sizeof(p)表示的是指针本身所占空间大小,32位下为4.
sizeof(*p)表示的是指针所指数据类型所占的大小,整型,也为4.
int a[100];
sizeof(a)、sizeof(a[100])、sizeof(&a)、sizeof(&a[0])的值分别是多少?
解答:
首先sizeof(a)很明显是整个数组的大小,所以是400
sizeof(a[100]) 为4,a[100]是表示第100个元素的下一个元素,使用sizeof(a[100])不会出错的原因是sizeof 是关键字不是函数。函数求值是在运行的时候,而关键字sizeof求值是在编译的时候。虽然并不存在a[100] 这个元素,但是这里也并没有去真正访问a[100], 而是仅仅根据数组元素的类型来确定其值。
sizeof(&a)为4,表示存储地址空间大小,在Visual C++6.0下输出为400,可能编译器把a和&a等同起来了,虽然他们的值是一样的,但是意义不一样。
sizeof(&a[0]) 取第一个元素的地址,也是4。
int b[100];
void fun(int b[100])
{
sizeof(b);// sizeof (b) 的值是多少?
}
解答:
还是为4,其实数组作为参数时,int b[100]和int b[]没区别,也就相当于int *b 。所以sizeof(b) 就是指针的大小。