sizeof和strlen区别

(1)strlen

strlen()是函数,用于计算字符串数组的实际长度(到‘\0’结束,不包含‘\0’);strlen只能用于计算char *a或char a[]格式的,不能用于计算string类型。

char a[10];   //未初始化,长度不确定
char b[10]={};  //初始化为’空,NULL;长度为0,
char c[10]="abc";  //遇到’\0‘结束,实际长度为3
char d[10]="abc\0def";   //遇到’\0‘结束,实际长度为3
char *e="abc";  //遇到’\0‘结束,实际长度为3
cout<<strlen(a)<<" "<<strlen(b)<<" "<<strlen(c)<<" "<<strlen(d)<<" "<<strlen(e);

//result
0 0 3 3 3
string str="abc";
strlen(str);   //error,strlen不能用于string类型
str.size(); /*ok,string自带函数,计算实际包含的字符长度,长度为3.注意,size()不是根据结尾有无‘\0'来实现的,可以定义一个string类型的迭代器it,以it==str.end()为截至条件进行计算*/

(2)sizeof

sizeof是操作符,计算的是所占内存的实际长度,单位是字节,可用于常量,变量,数据类型,函数,sizeof是基于数据类型来计算长度的

//对于数字类型的常量,sizeof计算的是该数字所属数据类型的长度
sizeof(2)  //2是int类型,长度为4
sizeof(2.1)  //2.1是double类型,长度为8

sizeof(int) //4
sizeof(double) //8

//对于字符串类型的常量,sizeof计算的是所有字符的长度,包括‘\0’
sizeof("abc")        //包含4个char类型的字符,包括末尾隐含的'\0',char类型长度为1,总长度为4
sizeof("abc\0def")  //长度为8,包含8个char类型的字符,将‘\0'作为普通字符,char类型长度为1,总长度为8
char a[10];  //10  char类型长度为1,包含10个char类型的数组长度为10
int f[10];   //40  int类型长度为4,包含10个int类型的数组长度为40

char b[10]={};  //10
char c[10]="abc";  //10
char d[10]="abc\0def";  //10

char *e="abcde";
//sizeof(e)计算的是指针e所占内存长度,而不是e指向的字符串长度
sizeof(e):8
//sizeof(*e)计算的是字符串中第一个字符的长度
sizeof(*e):1

int *p = nullptr;
cout << sizeof(p) << endl; //8

void fun(int a[10]){
	cout<<sizeof(a);//8   数组做形参,此时数组名代表的是指针
}

char a[]={'a','b','c'};
strlen(a);  //因为a[]结尾没有‘\0',所以长度不确定
sizeof(a); //3

总结:strlen计算的是字符串中’\0’结尾之前的字符长度,而sizeof是以数据类型为基础,大小为(数据类型长度*元素个数),元素个数为声明的个数,与有无初始化无关。

上一篇:vue 提交form表单,含图片,element-ui


下一篇:C语言递归解析