C语言-操作符详解之sizeof() 与 库函数strlen()的区别
sizeof()与strlen()的区别
初学者常常会将sizeof() 和 strlen() 混淆,但其实两者有很大不同,在这里章鱼哥做一个整理,希望可以帮到大家
sizeof()
sizeof() 是 C语言中的一个单目操作符,计算的是参数占有内存的大小,单位是字节,返回的是无符号整型sizeof() 并不关注内存中存放的具体数据,sizeof()的参数可以是变量、数组、类型和指针。
(这里章鱼哥可以给大家证明一下)
//证明sizeof()返回的是无符号整形:
int main()
{
int i = 0;
i--;
printf("%d\n", i);
printf("%d\n", sizeof(i));
if (i > sizeof(i))
printf(">");
else
printf("<");
}
这里我们可以看到在 i > sizeof(i) 条件为真,但是-1 又怎么可能大于4呢,其实这里发生了隐式类型转换(之后章鱼哥会专门出一篇文章讲隐式类型转换)。
在i > sizeof(i) 这个表达式中,‘>’ 是C语言中的双目操作符,而在双目操作符的两端的类型不同时,就会发生隐式类型转换。这里呢就将i的(有符号整型)int类型转换为了无符号整型。
又因为 i = -1;在计算机中是以补码的形式进行存储的,(11111111 11111111 11111111 11111111),在将其转化为无符号整型后,计算机认为这32个1 全部都是数值位,所以在i > sizeof(i) 这个表达式中 i 就是一个相当大的一个数字。
srtlen()
strlen() 是C语言中的一个库函数,**头文件是<string.h>**是用来求字符串的长度,只针对字符串,统计的是字符串中 ‘\0’ 之前,字符的个数,并且strlen() 的返回值也是 无符号整型。
在使用strlen() 或者 是遇到了与其相关的题型,需要额外注意的是字符数组的初始化方式。
看几个例子:
#include<stdio.h>
#include<string.h>
//验证strlen() 的结束标志
int main()
{
char arr1[] = "abcde"; //以字符串的形式初始化
char arr2[] = { 'a', 'b', 'c', 'd', 'e'}; // 以字符的形式初始化
char arr3[] = { 'a', 'b', 'c', 'd', 'e', '\0'};
char arr4[10] = { 'a', 'b', 'c', 'd', 'e'};
printf("arr1:%d\n", strlen(arr1));
printf("arr2:%d\n", strlen(arr2));
printf("arr3:%d\n", strlen(arr3));
printf("arr4:%d\n", strlen(arr4));
return 0;
}
我们来研究一下,不同的初始化方式,为什么会出现不同的结果
大家可以看到,当以字符串的形式初始化字符数组的时候,计算机会自动在字符串的末尾补上 ‘\0’, 而当以字符的形式初始化字符数组时就没有。
我们也可以看一下,为什么arr2的长度为什么是37
在红框00 之前,刚好是37个,或许还有人疑惑,0也不是‘\0’啊, 其实字符在内存中存放的是ASCII码值,而‘\0’的ASCII码值就是0;这也就是说明,当使用strlen()库函数求字符串长度时,计算机会从所要求的位置开始查找,直到找到 ‘\0’ 为止。
这也是为什么arr4 的大小 明明是10个,为什么返回字符的个数是5的原因,只初始化部分,剩余的部分会自动初始化为0。(有图有真相)
好了,本次呢就讲解到这里,感谢大家观看,我是专注学习的章鱼哥!