一.字符串的size()函数返回字符串的长度,不包括结束符'\0';
如:string s = “abc";或string s = "abc\0";
cout<<"s.size()="<<s.size()<<endl;
输出的都是: s.size()=3; //不包括‘\0';
char ps[] = {'a','b','c','d','\0'};
string p = ps;
cout<<"ps.size()="<<p.size()<<endl;
输出的是:ps.size()=4; //不包括‘\0';
也就是说:字符串的size()是表示字符串中真实有意义的字符的长度,结束符只是用于标记该字符串的结束,并无实际意义,所以不算在长度里面。
二.操作符sizeof(类型名 或 表达式)返回的是类型名所指定的类型或表达式的结果类型所占的字节数;
如:sizeof(string)值为32;
string s;
sizeof(s)也是32;
char arr[] = {'a','b','c','\0'};
char arr2[] = {'a','b','c'};//这种写法不好,要记得加上字符串结束符'\0'。
char arr3[20] = {'a','b','c','d','e','\0'};
char arr4[] = "ab";//这里会自动在字符串尾部加上字符串结束符'\0',故数组arr4的长度为3.
char *p = arr4;
sizeof(arr);的值为4,包括结束符'\0';
sizeof(arr2);的值为3;
sizeof(arr3);的值为20,这里要注意,并不是6.
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;
这里延伸一下,extern unsigned int strlen(char *s)这个函数,返回的是从s的地址开始搜索,知道遇到结束符为止的长度,不包括结束符。
特别的是,如果使用的是sizeof(表达式); 这种用法,那么该语句并不会对表达式本身求值。
例如:
int a = 4;
sizeof(a+=3); //执行完这条语句后,a的值并没有改变为7,仍然是4;
也就是说:sizeof()用于数组的时候,返回的是数组在内存中占用的字节数(如果是字符数组,则包括结束符);
用于其他变量或对象的时候,返回的是变量或对象所对应的数据类型在内存中占用字节长度。