(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是以数据类型为基础,大小为(数据类型长度*元素个数),元素个数为声明的个数,与有无初始化无关。