C语言-操作符详解之sizeof() 与 库函数strlen()的区别

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。(有图有真相)
在这里插入图片描述

好了,本次呢就讲解到这里,感谢大家观看,我是专注学习的章鱼哥!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值