区别sizeof和strlen()


前言

初学C语言阶段,我们会接触到不少一般的运算符,如自增(++)、自减(- -)以及sizeof运算符…在谈到sizeof的时候,另一个类似的东西会被拿出来作比较——strlen();
在这篇博客中我将向大家介绍sizeof和strlen()的区别和用法;


一、sizeof概述

sizeof是C语言中的长度运算符,在它的后面常常跟着一对括号( ),而括号中的内容就是这个运算符所要计算的对象(注意是对象而非参数,参数是函数中的概念),运算的结果为十进制数字,单位为字节(byte)。

二、strlen()概述

strlen()是C语言*<string.h>*头文件中包含的库函数,strlen后面跟着的一对括号()是函数的一个标志,括号内是函数的参数;
C语言是这样定义库函数strlen()的:

size_t strlen( const char *string )

size_t 是C语言重新定义的类型(typedef),表示无符号整型(unsigned int)
const char* 是strlen()函数的参数类型,即字符指针;

三、sizeof和strlen()的对比

由用法入手,我们先来比较下面两串代码:

int arr1[5] = { 1,2,3,4,5 };
printf("%d", sizeof(arr1));

输出结果为20;
这里sizeof计算了数组arr的大小:由于数组中有5个元素,每个元素都是int类型,且int类型的数据所占字节数为4(byte),因此输出结果为4*5=20;

那么,如果用strlen()呢?

int arr1[] = { 1,2,3,4,5 };
printf("%d", strlen(arr1));

编译器报出警告:“函数”: 从“int [5]”到“const char ”的类型不兼容
strlen()函数的参数是
char*类型,这与数组arr1的类型不符;

我们再使用字符数组arr2进行对比:

char arr2[] = "12345";
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr2))/sizeof(arr[0]); 
//我们用arr2整个数组的大小除以arr2[0]这个首元素的大小,得到的就是数组中元素个数;

输出结果为5和6

5和6之间1的偏差是哪里来的呢?下面我再来深入分析sizeof和strlen()的不同:
我们将字符串“12345”存放在arr2数组中,然而在内存中,arr2包含了字符1,2,3,4,5以及一个用作字符串终止标志的空字符’\0’,共6个字符;

sizeof运算符仅仅负责将数组arr2所占的内存空间大小计算出来,所以当我们把arr2交由它计算的时候,空字符’\0’也被当做一个字符计算在内,所以此时arr2数组的大小是6个字节;

然而对于strlen()这个函数而言,我们将arr数组名传给它(在这种情况下数组名是首元素地址),那么strlen()函数就会以这个首元素地址为起始点,向后一个个地计算数组中的字符个数,当它遇到空字符’\0’时,便停止向后计算,并且这个’\0’不会被它计算在内;所以第二个的输出结果为6-1=5;

补充点:arr作为数组名单独出现的时候,大多数情况下表示的是首元素的地址,除两种情况:
1、sizeof(arr):这里的arr表示的是整个数组,所以sizeof计算了整个数组所占字节的大小;
2、&arr:这里取地址arr取出的是整个数组的地址,当我们对其解引用时也相当于获得了整个数组;


总结

sizeof和strlen()的区别关键就在于空字符'\0',在我们后续的学习中这两个会常常出现,用作计算数组元素个数以及字符串长度,倘若加以练习,相信大家都能很快地将这两个相似的概念分清楚;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白龙码~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值