漫谈程序编码 C++
char s3 [] = {'h', 'e', 'l', 'l', 'o' };
char s3[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char s3[] = "hello";
勿把字符数组当字符串
皮贝贝
posted @ 2008年11月23日 20:12
in 未分类
, 187 阅读
汇编器的执行过程
-
字符串
字符串诚然是字符数组,于字符串考虑我们是这样初始化的:
char* s1 = "hello"; // 自动转作 const char* s1 = "hello"
char s2[] = "hello";
char s2[] = "hello";
编译器对上面的处理是在最末加一个 '\0' , 一些字符串函数也是依此来判定字符串结尾,因此 strlen() 函数对上述求值为 5, 而求其大小sizeof(s1) == 6.
上述是字符串初始化的经典形式。是标准所推荐的安全初始化。
-
字符数组
若是我们是依普通数组之方式初始化:
char s3 [] = {'h', 'e', 'l', 'l', 'o' };
于此,s3 只是一个盛放着散乱的字符的数组, 故sizeof( s3 ) == 5, 但对字符串操纵的函数却出乎意料, strlen () 函数可能所得的值要大于5.
而改成下列, 就变成了字符串了:
char s3[] = {'h', 'e', 'l', 'l', 'o', '\0'};
而这与下列是等价的:
char s3[] = "hello";
而此处编译器帮你完成了尾部加 '\0'.
-
总论
所以说,
字符串 != 字符数组。
确切的说是:
字符串 < 字符数组
即字符串是字符数组的子集。字符串是特殊的字符数组, 是一个尾部带 '\0' 小尾巴的特殊字符数组,而这个小尾巴是由编译器来帮你完成。
