简单定义:
char a1[3] = {'c', '+', '+'}; //定义一个含有3个字符的字符数组
char a2[4] = {'c', '+', '+', '\0'}; //定义一个含有4个字符的字符数组
第二条语句与下面的数组是相等的:
char a3[4] = "c++";
或
char a3[] = "c++";
因为使用字符串字面值给字符数组赋值,系统会手贱在末尾补上空字符——'\0';使用字符赋值则妥妥的不会,所以a1字符数组初始化后里面没有'\0'。
在获取一个字符数组的大小时,可以说有2种方式:
(1)使用sizeof(array)/sizeof(array[0]) 计算数组长度。
(2)使用C标准库函数strlen(),c++将其定义在cstring.h头文件中。
第一种是最靠谱的方法,可以用在任何数组上面,尝试输出a1, a2, a3的长度:
cout << sizeof(a2)/sizeof(a1[0]) << endl;
cout << sizeof(a2)/sizeof(a2[0]) << endl;
cout << sizeof(a3)/sizeof(a3[0]) << endl;
输出:
3
4
4
第二种方式使用情况比较有限,像a2以空字符'\0'结尾的,且数组中间没有空字符元素;以及像a3这种,用字符串字面值初始化的数组才有用:
cout << strlen(a3) << endl;
输出:
3
为什么跟上面不一致?因为strlen方法不会将末尾的空字符'\0'计算在内。相反,它遇到'\0'就会停止计算。不信我们可以试一下a1, a2调用以下strlen看看有什么结果:
cout << strlen(a1) <<endl;
cout << strlen(a2) <<endl;
输出:
9
3
因为a1数组内没有'\0'元素,所以strlen方法会读出数组的范围,直至遇到一个'\0'字符。因此返回的是一个不可预知的数字,笔者的机器上运行时9,在别的机器上很可能就不是了。
a2有4个元素,因为最后一个元素是'\0',所以没有计算在内。即使将a2改成这样,strlen(a2)的输出结果也会是3。
char a2[7] = {'c', '+', '+', '\0', 'p', 'r', 'i'};
所以,如果要获得a3这种字符数组的长度,还需要在调用strlen()方法后再加1,才返回正确的数组长度:
char a3[] = "c++";
cout << strlen(a3) + 1 << endl;
输出:
4
真是这样吗,如果我给a3的字符串字面值里面加\0呢?
char a3[] = "c++\0";
cout << strlen(a3) + 1 << endl;
输出:
6
把\0放入双引号中意味着它被当做是字符串,而非单个字符。