C风格字符串

学过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风格的字符串真的不好用。

猜你喜欢

转载自blog.csdn.net/qq_24032231/article/details/83961716