描述
如果你经常刷笔试题,那你一定会刷到这样的题目:
char str[] = “hello”;
printf(“%d %d
”, sizeof(str), strlen(str));
const char *str = “hello”;
printf(“%d %d
”, sizeof(str), strlen(str));
把 sizeof 和 strlen 放在一起考察,题目不难,只要你的C语言基本功扎实,做出来应该没问题。
第一个,str是个数组,数组里面的内容是字符串hello。但是需要注意的是,字符串都是以'�'结尾,所以数组实际占6个字节。
sizeof是关键字,用于求解类型的长度,sizeof加上数组名,表示数组所占的字节数,所以结果是6。
strlen是字符串处理函数,求解字符串的长度,长度不包含'�',所以结果是5。
第二个,str是指针,指向字符串常量。
sizeof加上指针,表示指针变量占的字节数,32位系统是4字节,64位系统是8字节。至于说字符串长度,跟上面一样,是5个字节。
这些都算是常见的,我们再来看下不常见的,指针都当作8字节来处理。
int a[] = {1, 2, 3};
printf("%ld
", sizeof(&a));
printf("%ld
", sizeof(*a));
int b[2][3] = {0};
printf("%ld
", sizeof(b[0]));
printf("%ld
", sizeof(b[0] + 1));
printf("%ld
", sizeof(&b[0]));
一个一维数组,&a表示数组的地址,sizeof(&a)是8字节。
*a表示数组第一个元素,sizeof(*a)是4个字节。
对于二维数组,b[0]表示首行首元素地址,类似于一维数组的数组名,sizeof(b[0])就是第一行的长度12字节。
b[0]+1表示首行第二个元素的地址,编译器当作指针来处理,sizeof(b[0] + 1)是8个字节。
&b[0]表示数组首行地址,编译器同样把它当作指针来处理,sizeof(&b[0])也是8字节。
审核编辑:汤梓红
打开APP阅读更多精彩内容