学过C语言的应该知道C风格的字符串形式是比较复杂的,这种风格的字符串其实是字符型数组。以下两种形式是等价的。
#include <iostream>
using namespace std;
int main()
{
char s1[] = "Hello";
char s2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << s1 << endl;
cout << s1 + 1 << endl;
cout << *(s1 + 1) << endl;
cout << s1[1] << endl;
cout << s2 << endl;
cout << s2 + 1 << endl;
cout << *(s2 + 1) << endl;
cout << s2[1] << endl;
return 0;
}
运行结果
可以看出,以上两种方式是等价的。然而,字符行数组与数值型数组有很大的不同:
- 数值型数组的数组名是可以作为首元素的地址,而字符型数组的数组名字符串;
- 数值型数组的的首地址的偏移量是对应索引值的元素地址,而字符型地址的数组名的“偏移量”表示的是对应索引值之后的元素。
当然也有相同的地方:读取数组对应索引元素的操作是一样的(可以根据索引得到,也可以根据计算偏移量然后取地址内容得到)。
另外,提几点需要注意的位置:
- 字符型数组是以
\0
结尾的,表示的是该字符串的结束,这个结束符占有一个字节(一个字符)。 - 结果表明,即使没有
\0
结尾仍能得到一样的结果,并且没有资料说明的会出现垃圾值,这是否是编译器在编译时加上\0
呢? - 结果表明,字符型数组也能如同动态数组一样进行越界操作,且会以某种规则得到相应结果,这是非常奇怪的一点,不知是否与系统平台或者编译器有关,但需要指出的是,C风格的字符串真的不好用。