11 return sumofi;
12 }
13
14 int main()
15 {
16 int allAges[] = {21, 22, 22, 19, 34, 12};
17 cout<<Sum(i, sizeof(allAges)/sizeof(int))<<endl;
18 system("pause");
19 return 0;
20 }
(7)、C风格字符串与C++风格字符串类(String)的sizeof和strlen
考虑下面的问题:
1 #include <string>
2 using namespace std;
3
4 char a[] = "abcdef";
5 char b[20] = "abcdef";
6 string s = "abcdef";
7
8 cout<<strlen(a)<<endl; // 6,字符串长度9 cout<<sizeof(a)<<endl; // 7,字符串容量10 cout<<strlen(b)<<endl; // 6,字符串长度11 cout<<sizeof(b)<<endl; // 20,字符串容量12 //cout<<strlen(s)<<endl; // 错误!s不是一个字符指针。
13 cout<<sizeof(s)<<endl; // 16, 这里不代表字符串的长度,而是string类的大小
14
15 a[1] = '\0';
16 cout<<strlen(a)<<endl; // 1
17 cout<<sizeof(a)<<endl; // 7,sizeof是恒定的,因为是前面已经固定分配过7个单元,虽然现在字符串变为空串
18
记住:String是class类型。(关于class类型的sizeof请参见第五节)
strlen是寻找从指定地址开始,到出现的第一个0之间的字符个数,他是在运行阶段执行的,而sizeof是得到数据的大小,在这里是得到字符串的容量。所以对同一个对象而言,sizeof的值是恒定的。string是C++类型的字符串,他是一个类,所以sizeof(s)表示的并不是字符串的长度,而是类string的大小。strlen(s)根本就是错误的,因为strlen的参数是一个字符指针,如果想用strlen得到s字符串的长度,应该使用sizeof(s.c_str()),因为string的成员函数c_str()返回的是字符串的首地址。实际上,string类提供了自己的成员函数来得到字符串的容量和长度,分别是Capacity()和Length()。string封装了常用了字符串操作,所以在C++开发过程中,最好使用string代替C类型的字符串。
STL中的String类:
string的sizeof和平台相关的,string类最简单的可以近似认为是包含两个数据成员:char *指针成员( 表示字符数组)和 int成员(表示字符串长度)。但是事实上并不是这样定义的,可能还有其他数据成员,如编译器插入指针vptr等。因此根据不同的实现,可以查看String类的定义中如何定义。比如在我现在机器上,sizeof(string) = 16.
小编推荐:
计算机二级C语言:C sizeof使用规则及陷阱分析(1)