C语言sizeof关键字–不是函数!

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) 就是指针的大小。

本文链接:http://www.alonemonkey.com/sizeof-not-function.html