strlen 和 sizeof 的区别

首先,让我们先了解一些strlen和sizeof的定义 :
一、strlen
1、strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。注:用char s[6] = “string”; 这种初始化方法时, 后面的常量字符串"string"占7字节, 最后一个字节为’\0’。如果你用char s[6] = {‘s’,‘t’,‘r’,‘i’,‘n’,‘g’};这种方式并不能将s初始化为一个字符串. 没有以’\0‘结尾,’它只是一个容纳了char的数组. 只有以’\0’结尾的char数组才能称之为字符串.
2、strlen是一个函数。strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。注:这里需要特别注意,strlen求的是字符串实际长度。如 int a[ 5 ] ={1,2,3,4,5} strlen(a) //错误,数组a不是字符数组。

二、sizeof
1、在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。注:记住是内存字节数,具体的数据类型对应具体的字节数。

三、两者的区别
样例1:
#include
#include
using namespace std;
int main(void)
{
char aa[200]={’\0’};
cout<<strlen(aa)<<endl;
return 0;
}
/这个样例结果为0而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个取字节运算符,
strlen是函数。
/

样例2:
#include
#include
using namespace std;
int main(void)
{
char aa[200]=“Hello, World!”;
cout<<strlen(aa)<<endl;
return 0;
}
/这个样例的结果为13(逗号后面有一个空格)/

样例3:
#include
#include
using namespace std;
int main(void)
{
char aa[200]=“hello”;
cout << strlen(aa) << endl;
return 0;
}
//这个样例的结果为5
sizeof(aa); //返回200
int a[10];
sizeof(a)
//返回40 (根据语言int型 c/c++由编译器决定是两个或四个 java 是四个)

1、对静态数组的处理:
char str[20000]=“0123456789”;
int a=strlen(str); //a=10; >> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20000; >> sizeof 计算的则是分配的数组 str[20000] 所占的内存空间的大小,不受里面存储的内容改变。

2、对指针的处理:
char* ss = “0123456789”;
sizeof(ss) //结果 4>>ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的值所占的空间,是char*类型,所以是4
sizeof(*ss) //结果 1>> *ss是第一个字符 其实就是获得了字符串的第一位’0’ 所占的内存空间,是char类型的,占了 1 位
strlen(ss)= 10 //>> 如果要获得这个字符串的长度,则一定要使用 strlen
//sizeof返回对象所占用的字节大小. 正确
//strlen返回字符个数. 正确

在使用strlen时,有一个很特别的情况,就是数组名到指针蜕变
char Array[2000] = {‘0’};
sizeof(Array) == 2000;
char *p = Array;
strlen( p ) = 1; //结果为1
sizeof( p )= 4 //结果为4
//在传递一个数组名到一个函数中时,它会完全退化为一个指针

部分内容参考自百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值