sizeof:sizeof(),他的参数可以是数组、指针、类型、对象、函数等。他是一个运算符,用来计算这个参数的所占的总的字节数。
strlen:strlen(),他的参数必须是字符型指针(char*),当数组名作为参数传入时,实际上数组就退化成指针了。他是一个函数用来返回这个参数中字符串的长度。我们来比较一下:
1 #include <iostream> 2 using namespace std; 3 4 int five() 5 { 6 return 0; 7 } 8 9 int main() 10 { 11 char one[20] = "1234567890"; 12 char *two = "9234567890"; //9234567890 存储在常量区,two在栈上。下面解释 13 int three = 5; 14 string four = "1234567890"; 18 cout << "sizeof(数组) = " << sizeof(one) << endl //计算了参数占的总字节数 19 << "sizeof(字符型指针) = " << sizeof(two) << endl //存储地址占了8个字节 20 << "sizeof(字符型指针) = " << sizeof(*two) << endl //存储了一个字符,占了一个字节 21 << "two = " << two << endl 22 << "*two = " << *two << endl 23 << "sizeof(整型) = " << sizeof(three) << endl 24 << "sizeof(字符串) = " << sizeof(four) << endl 25 << "sizeof(函数) = " << sizeof(five()) << endl << endl; 26 27 cout << "strlen(数组) = " << strlen(one) << endl //返回参数中字符串所占的大小,遇到 结束 28 << "strlen(字符型指针) = " << strlen(two) << endl 29 /* << "strlen(整型) = " << strlen(three) << endl //这三个报错,不能作为strlen的参数 30 << "strlen(字符串) = " << strlen(four) << endl 31 << "strlen(函数) = " << strlen(five()) << endl*/ << endl; 32 34 return 0; 35 }
结果为:
sizeof(数组) = 20 sizeof(字符型指针) = 8 sizeof(字符型指针) = 1 two = 9234567890 *two = 9 sizeof(整型) = 4 sizeof(字符串) = 32 sizeof(函数) = 4 strlen(数组) = 10 strlen(字符型指针) = 10
length、size:
这两个函数一样。 string类的size()/length()方法返回的是字节数,不管是否有汉字。
解释一下上面代码中遇到的问题:
char *s ; s = "China";
char *s = "China";
上面这两种是一样的。为什么可以把一个字符串赋给一个指针变量。。这不是类型不一致吗???C++中编译器会给字符串常量分配地址,如果 "China", 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 。。。。s = "China" ,意思是什么,对了,地址。其实真正的意义是 s ="China" = 0x3000;看清楚了吧 ,你把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质表现是代表它的第一个字符的地址。。。。。。。。。。s = 0x3000这样写似乎更符合直观的意思。。。所以上面的我们two就是“9234567890”的首地址,而*two其实是一个字符的值。所以当打印two就相于数组的首地址一样打印出来整个字符串。而*two打印的是一个值。而为什么sizeof(two)打印出来是8呢,因为他是一个运算符,只计算这个地址所占的字节数,而strlen是函数,返回的是字符串的长度。