先说结论:
区别一:
- sizeof是用来求变量/类型在内存中所占的空间大小,关注的是空间,单位是字节。
- strlen求的是字符串长度,关注的是字符中有效的字符,单位是有效字符的个数。
区别二:
- sizeof是操作符,只有在运算对象为类型的时候,才必须带圆括号,其他时候,圆括号可有可无。如sizeof(int)时,必须带括号,sizeof ‘a' 时,括号可有可无。
- strlen是库函数。是函数,使用时后面的圆括号就必不可少。
接下来,我们通过解读一段代码,来更进一步的分析。
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char arr_1[] = { '1','2','3'};
char arr_2[] = "123";
printf("sizeof(arr_1) = %zu\n", sizeof (arr_1));
printf("strlen(arr_1) = %zu\n", strlen(arr_1));
printf("sizeof arr_2 = %zu\n", sizeof arr_2);
printf("strlen(arr_2) = %zu\n", strlen(arr_2));
return 0;
}
运行结果:
分析代码:
1.
char arr_1[] = { '1','2','3'};
printf("sizeof(arr_1) = %zu\n", sizeof (arr_1));
sizeof强调的是空间 ,arr_1数组中,存放了3个元素,每个元素的类型是char
,所以结果就是 3 * 1 == 3
2.
char arr_1[] = { '1','2','3'};
printf("strlen(arr_1) = %zu\n", strlen(arr_1));
strlen强度的是字符串中有效字符的长度。那么它如何判断有效字符呢?
strlen从实参出发,一直读取,直到遇见'\0'为止 ,'\0'之前有几个字符,它就返回几。而在arr_1中,没有'\0',所以它会一直往后读取,直到在内存中碰到'\0'为止。
3.
char arr_2[] = "123";
printf("sizeof arr_2 = %zu\n", sizeof arr_2);
用双引号引起来的字符串,如果结尾没有人为的添加'\0',那么系统会自动在结尾补上'\0', 所以这一个字符串里面其实有4个元素,分别为:
‘1’,‘2’, ‘3’, ‘\0’
故sizeof读取的是4个char类型的数据,所以输出 4
另外,我们也发现了sizeof后面的括号在特定的情况下,是可以省略的,这也进一步说明了sizeof是操作符,而不是函数。因为函数的括号是绝不可省略的。
4.
char arr_2[] = "123";
printf("strlen(arr_2) = %zu\n", strlen(arr_2));
我们现在已经知道了,strlen遇'\0'停止,然后返回'\0'之前的元素个数,所以返回 3