1、string中的size()和length()计算字符串中真实有意义的字符的长度
字符串的size()函数返回字符串的长度,不包括结束符'\0';
string a = "abcd";或string s = "abd\0";
cout << "a.size(): " << a.size() << endl;
cout << "a.length(): " << a.length() << endl;
输出的都是: 4; //不包括‘\0';
char p[] = { 'a', 'b', 'c', 'd', '\0' };
string str = p;
cout << "str.size(): " << str.size() << endl;
cout << "str.length(): " << str.length() << endl;
输出的是:4; //不包括‘\0';
因此:string中的size()表示字符串中真实有意义的字符的长度,结束符只是用于标记该字符串的结束,并无实际意义,所以不算在长度里面。
2、操作符sizeof(类型名 或 表达式)返回一个对象或者类型所占的内存字节数
数组的sizeof值等于数组所占用的内存字节数。//(char占1个字节,int占4个字节)
char a1[] = "abc"; sizeof( a1 ); // 结果是4,字符末尾还存在一个NULL终止符
int a2[3]; sizeof( a2 ); // 结果是3*4=12(依赖于int)
char arr[] = {'a','b','c','\0'}; //sizeof(arr);的值为4,包括结束符'\0';
//char arr2[] = {'a','b','c'};//不建议,加上字符串结束符'\0'会更好。//sizeof(arr2);的值为3;
char arr3[20] = {'a','b','c','d','e','\0'}; sizeof(arr3);的值为20,这里要注意,并不是6.
char arr4[] = "ab";
char *p = arr4;//字符串尾部自动加上字符串结束符'\0',故数组arr4的长度为3.
sizeof(arr4); //值为3,不是2,字符串字面值初始化字符数组时,字符串后面会自动添加结束符'\0',故数组的长度会包括'\0'。
sizeof(p);//值为4,p为指针,指针在32位系统中占4个字节,所以sizeof(p)的值为4,p指向长度为3的arr4数组所在的地址。
string ss = arr; // sizeof(ss)的值为32,并不是4;
经典考题:
double* (*b)[3][6];
cout<
问题解析:
b是一个很奇怪的定义,表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(b)就是4。
既然b是执行double*[3][6]类型的指针,*b就表示一个double*[3][6]的多维数组类型,因此sizeof(*b)=3*6*sizeof(double*)=72。
同样的,**b表示一个double*[6]类型的数组,sizeof(**b)=6*sizeof (double*)=24。
***b就表示其中的一个元素,也就是double*了,所以sizeof(***b)=4。
****b,就是一个double了,所以sizeof(****b)=sizeof(double)=8。
扩展:
在C语言中,与strlen函数不同的是,sizeof不是一个函数,而是判断数据类型或者表达式长度符的关键字,也可以说是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数。
注意:字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来!!!!!!!!!!!
一、如何求数组中元素的个数?(以下两种方式是等价的)
int len0 = sizeof(a1)/sizeof(char);//总长度/单个元素的长度 char型
int len1 = sizeof(a2)/sizeof(a2[0]);//总长度/第一个元素的长度 int型
二、若使用的是sizeof(表达式),那么该语句并不会对表达式本身求值。
int a = 4;
sizeof(a+=3); //执行完这条语句后,sizeof(a)的值并没有改变为7,仍然是4;
三、extern unsigned int strlen(char *s)这个函数,返回的是从s的地址开始搜索,直到遇到结束符为止的长度,不包括结束符。