(转载)写的非常好
sizeof常年被人误认为函数
作用:计算数据所占空间大小
sizeof 是关键字不是函数,其实就算不知道它是否为 32 个关键字之一时,我们也可以
借助编译器确定它的身份。看下面的例子:
inti=0;
A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;
毫无疑问,32 位系统下 A),B)的值为 4。那 C)的呢?D)的呢?
在 32 位系统下,通过 Visual C++6.0 或任意一编译器调试,我们发现 D)的结果也为 4。
咦?sizeof 后面的括号呢?没有括号居然也行,那想想,函数名后面没有括号行吗?由此轻
易得出 sizeof 绝非函数。
好,再看 C)。编译器怎么怎么提示出错呢?不是说 sizeof 是个关键字,其后面的括号
可以没有么?那你想想 sizeof int 表示什么啊?int 前面加一个关键字?类型扩展?明显不
正确,我们可以在 int 前加 unsigned,const 等关键字但不能加 sizeof。好,记住:sizeof 在
计算 变量所占空间大小时,括号可以省略,而计算 类型( 模子)大小时不能省略。一般情况下,
咱也别偷这个懒,乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字”。
做我的关键字,让人家认为是函数去吧。
char *p = NULL;
sizeof(p)的值是多少?(所有的指针都为4)
sizeof(*p)呢?(取内容,1)
char a[100];
sizeof (a) 的值是多少?(100*1=100)
sizeof(a[100])呢?(第100个char型所以为1)
sizeof(&a)呢?(此为取地址,是一个指针,4)
sizeof(&a[0])呢?(同上。4)
char b[100];
void fun(char b[100])
{
sizeof(b);// sizeof (b) 的值是多少?(4)
}
扩展
strlen:
求字符串的实际长度(遇到第一个’\0’结束。不包括’\0’)
函数原型
int strlen(const char *str)
{
int len = 0;
assert(str != NULL);
while(*str++)
{
len++;
}
return len;
}
思考
char buf[] = "hello ";//(hello后有个空格)
strlen(buf);//是多少,看定义(包括空格)