1. sizeof 是算符,不是函数。所以下面的写法是正确的:
struct student{
char *name;
unsigned char age;
}
sizeof( struct student ), 或者可以说 sizeof 可以用类型做参数。
因此 sizeof 还可以用函数做参数,例:
short f();
printf(“%d\n”, sizeof( f() )); // 输出的结果是 sizeof (short),即2.
2. 作为统计长度的方法,sizeof 与 strlen的差别,本质是一个是算符,一个是函数。因此 对大部分编译程序, 在编译的时候,就把 sizeof 计算过了,结果是类型或变量的长度。例:
char str[20] = "0123456789";
int a = strlen( str); // a = 10; strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b = sizeof (str); // b = 20 sizeof 计算的则是分配的数组 str[20]
strlen 的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
3. 因为 sizeof 是算符 所以 sizeof 后如果是类型 必须加括弧,如 sizeof (struct student), 如果是变量名 可以不加括弧,如 sizeof str
4.在看看下面两种情况
char *ss = "0123456789";
sizeof (ss) //结果是 4,ss是指向字符串常量的字符指针,是一个地址,所以 sizeof(ss) 是一个地址所占的空间
sizeof (*ss) // 结果是1, *ss是第一个字符,sizeof(*SS) 是字符所占的内存空间
5. sizeof 作为操作符,不能返回动态呗分派了的数组或外部数组的尺寸,因此在数组作为参数传给函数,同时还想在函数内知道数组大小,需要这样做
fun (unsigned char *p1, int len) // 长度又另一个形参 len 掺进去。因为数组作为参数传给函数时,传递的是指针而不是数组,是数组的首地址。
{ // fun(char [8]); fun(char []); fun ( char *),这三种写法是等价的。
unsigned char *buf = new unsigned char[len + 1]; // 进入函数后用 memcpy 拷贝出来,长度由另一个形参传进去。
memcpy(buf, p1, len);
}