关键字sizeof和函数strlen的区别

"本文详细探讨了C/C++中的sizeof运算符和strlen函数,它们分别用于计算数据类型或变量所占内存大小和字符串长度。sizeof是一个关键字,不需括号也可使用,而strlen是函数,需要包含。关键区别在于:sizeof计算字符数组时包括未赋值的内存空间,strlen则直到遇到''才停止计数。示例展示了在不同情况下的使用和可能产生的差异。"
摘要由CSDN通过智能技术生成

写在前面:

在前面的学习过程中,使用到了sizeof和strlen两个比较陌生的名词.那么今天就一起探究学习一下两者,并且对比一下两者都有哪些区别.

并且在此之前给大家在推荐一个学习C/C++的网站:cplusplus.com - C++资源网络http://www.cplusplus.com/

一.sizeof

sizeof(data type);

顾名思义,从英语的角度来分析就是什么的大小,其实这个关键字就是用来计算变量或数据类型所占的空间大小.在后面学习C++的时候,sizeof运算符也可以用于获取类,结构,共用体和其它用户自定义数据类型的大小.

首先必须要强调的是 sizeof是一个关键字并不是一个函数.

上面的图片可以清楚的了解到,sizeof后面的括号可以省略.因此更加印证了sizeof是一个关键字并不是一个函数,但是在使用的时候sizeof后面的括号在非必要时最好还是不要省略.

二.strlen

#include <string.h>
size_t strlen ( const char * str );
//函数返回值:从传入参数的地址进行向后遍历,遇到\0则停止计算,计算出的值返回
//参数:字符串的起始地址

同样这里也需要特别强调一下,strlen是函数,并且是在string.h头文件下.

该函数是用来计算字符串的长度,遇到\0则停止计算.
模拟实现strlen:

//使用递归的方式进行实现:
size_t Strlen(const char* str){
    if(*str == '\0'){
        return 0;
    }
    return 1+Strlen(str+1);
}

三.区别对比 

为什么要拿关键字sizeof和函数strlen进行对比呢?两者有什么区别吗?我觉得这是大部分人刚开始心中的一个小疑问,那么我们接下来就进行探究.

其实是在计算字符数组和字符串相关的问题时可能会有疑惑,以下会有几个典型的例子来分析一下:

(1).

同样的字符数组,为什么两者的计算结果相差如此之大呢?

  1. sizeof是用来计算所占空间大小,该字符数组中有5个字符,每个字符占1个字节,因此最后的计算结果是5
  2. strlen是用来计算字符串的长度,并且是只有在遇到\0才会停止计算.而该字符数组并没有包含\0,也不会像字符串有隐含的\0,因此该函数会继续向后遍历直至遇到\0.而字符数组后面的内存具有不确定性,因此计算所得的值也具有不确定性.

(2).

  1.  sizeof传入的参数是指针,计算的就是指针变量所占空间的大小.在32位系统下,指针变量所占空间大小为固定的4的字节大小.
  2. strlen计算的是字符串的长度,遇到\0则停止计算.由此也可以得知字符串中包含隐藏的\0. 字符串arr2在计算机的存储其实是"hello\0"这样的.

(3).

 看起来是同样的两个字符串,只不过一个是字符数组的形式,为什么计算的结果就不一样呢?

其实最根本的原因就是,字符串中包含隐藏的\0,\0也需要占据一个空间,所以这便是造成最终结果的差异的原因. 

(4).

 其实这里最主要的原因是,strlen函数遇到\0才会停止计算,而字符串如果没有显式写出\0的话,那么最终的结果就是不可预料的(\0出现在后面在哪块内存都是随机的).而字符串中包含隐藏的\0,结果是可以预料的.

采得百花成蜜后,为谁辛苦为谁甜. ----------- <<蜂>>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值