sizeof和strlen区别
1)strlen()是函数,用于计算字符串数组的实际长度(到‘\0’结束,不包含‘\0');strlen只能用于计算char *a或char a[]格式的,不能用于计算string类型
1 #include<iostream> 2 using namespace std; 3 void main() 4 { 5 char a[10]; //未初始化,长度不确定 6 char b[10]={}; //初始化为’空,NULL;长度为0, 7 char c[10]="abc"; //遇到’\0‘结束,实际长度为3 8 char d[10]="abc\0def"; //遇到’\0‘结束,实际长度为3 9 char *e="abc"; //遇到’\0‘结束,实际长度为3 10 cout<<strlen(a)<<" "<<strlen(b)<<" "<<strlen(c)<<" "<<strlen(d)<<" "<<strlen(e); 11 }
输出结果:
注:string 类型数据
string str="abc"; strlen(str); //error,strlen不能用于string类型 str.size(); /*ok,string自带函数,计算实际包含的字符长度,长度为3.注意,size()不是根据结尾有无‘\0'来实现的,可以定义一个string类型的迭代器it,以it==str.end()为截至条件进行计算*/
2)sizeof是操作符,计算的是所占内存的实际长度,单位是字节,可用于常量,变量,数据类型,函数,sizeof是基于数据类型来计算长度的
- 常量:
a.对于数字类型的常量,sizeof计算的是该数字所属数据类型的长度,如:
sizeof(2) //2是int类型,长度为4 sizeof(2.1) //2.1是double类型,长度为8
b.对于字符串类型的常量,sizeof计算的是所有字符的长度,包括‘\0’,如:
sizeof("abc") //包含4个char类型的字符,包括末尾隐含的'\0',char类型长度为1,总长度为4 sizeof("abc\0def") //长度为8,包含8个char类型的字符,将‘\0'作为普通字符,char类型长度为1,总长度为8
- 变量:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 void main() 5 { 6 char a[10]; //char类型长度为1,包含10个char类型的数组长度为10 7 char b[10]={}; 8 char c[10]="abc"; 9 char d[10]="abc\0def"; 10 char *e="abcde"; 11 int f[10]; //int类型长度为4,包含10个int类型的数组长度为40 12 cout<<"a:"<<sizeof(a)<<"\nb:"<<sizeof(b)<<"\nc:"<<sizeof(c)<<"\nd:"<<sizeof(d) 13 <<"\ne:"<<sizeof(e)<<"\n*e:"<<sizeof(*e)<<"\nf:"<<sizeof(f)<<endl; 14 }
输出结果:
注:
- 对于 char *e="abcde",sizeof(e)计算的是指针e所占内存长度,而不是e指向的字符串长度;sizeof(*e)计算的是字符串中第一个字符的长度,char类型长度为1,数组做形参,此时数组名代表的是指针,如void fun(int a[3]){cout<<sizeof(a);//a是指针,值为4}
- 对于string类型的变量,sizeof计算的是string对象所占的空间,而不是string所存储的字符串的大小,sizeof(string)大小与库有关,string在不同的库中实现可能不同
- 数据类型:
sizeof(int) //4 sizeof(double) //8
- 函数:
计算的是函数返回值类型的长度,如:
int fun(){...} sizeof(fun()) //计算int类型的长度,为4 sizeof不能计算返回值类型是void的函数
总结:由以上分析可以看出,strlen计算的是字符串中'\0'结尾之前的字符长度,而sizeof是以数据类型为基础,大小为(数据类型长度*元素个数),元素个数为声明的个数,与有无初始化无关。
char a[]={'a','b','c'}; strlen(a); //因为a[]结尾没有‘\0',所以长度不确定 sizeof(a); //值为3
关于结构体,公用体和枚举类型的sizeof将在下一篇博客中介绍