下面一段代码
#include <stdio.h>
#include <string.h>
void func(char str[50])
{
printf("A %d B %d\n",sizeof(str),strlen(str));
}
int main(void)
{
char stra[]="HelloWorld";
char *strb=stra;
printf("C %d D %d\n",sizeof(stra),sizeof(strb++));
func(++strb);
printf("E %d F %d\n",strlen(stra),strlen(strb++));
int i = 10;
printf("G %d\n",sizeof(++i));
printf("H %d\n",i);
getchar();
return 0;
}
的运行结果是
C 11 D 4
A 4 B 9
E 10 F 9
G 4
H 10
解释如下:
1. stra 是一个数组,对数组做sizeof 操作等效于对其元素类型做sizeof操作的结果乘上数组元素的个数;
2. 对char类型或值为char类型的表达式做sizeof操作保证得1.
因此 C处 sizeof(stra)是11,记住c风格字符串结尾符null.
3. 对指针做sizeof操作将返回存放指针所需的内存大小.
strb++是指针,在vs 2005系统中,一个指针型数据占据4个字节。故D处 sizeof(strb++)为4.
4. 将sizeof作用在表达式上,将获得该表达式的结果的类型长度,但是并没有计算表达式的值。
因此第一个printf之后, 调用func之前, strb仍然指向字符数组stra的第一个
5. 数组的两个特殊性质:一是不能复制数组;二是使用数组名时,数组名会自动转化为指向其第一个元素的指针
6. 处理数组的函数通常通过操纵指向数组中的元素的指针来处理数组
7. 编译器忽略数组形参的长度
因此传进func(++strb)的是指向stra的第二个元素的指针
8. strlen(p)返回从p指向的字符数组当前位置到字符结束符null的字符个数。
因此 B 处strlen(str),即strlen(++strb)是9,从e到d,包括d,但不包括null。
9. 在vs 2005系统中,一个int型数据占据4个字节.
10. 如果要获取一个指针所指向对象的大小,必须对该指针做解引用。