因为字符数组是普通数组,所以它们遵循数组的规则。 例如,要用预先确定的字符序列初始化一个字符数组,可以像其他数组一样:
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; |
上面声明了一个由6个char类型的元素组成的数组,初始化的字符是组成单词“Hello”的字符加上末尾的空字符“\0”。
但是字符数组还有另一种初始化方法:直接使用字符串字面值。
在前几章的一些例子中使用的表达式中,字符串字面量已经出现了好几次。通过将文本括在双引号(")之间来指定。例如:
"the result is: "
这是一个字符串字面值,可能在前面的一些示例中使用过。
双引号(")括起来的字符序列是文字常量。它们的类型实际上是一个以空结束的字符数组。这意味着字符串字面值总是在末尾自动附加一个空字符('\0')。
因此,名为myword的字符数组可以通过以下两种语句中的任意一种进行初始化:
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; char myword[] = "Hello"; |
在这两种情况下,第一种声明一个char类型的6个元素大小的字符数组myword:5字符组成“Hello”这个词, 加上最后一个null字符(\ 0),它指定序列的末尾,在第二种情况下,当使用双引号(")的时候,null字符是自动添加的。
请注意,这里我们讨论的是在字符数组被声明时对其进行初始化,而不是在之后 (一旦它们已经被声明)对它们赋值。实际上,因为字符串字面值是常规数组, 所以它们有相同的限制,不能被赋值。
下面的表达式(myword已经在前面声明),如: myword = "Bye"; myword[] = "Bye"; |
都不是有效的.都不会是:
myword = { 'B', 'y', 'e', '\0' }; |
这是因为不能给数组赋值。但是请注意,它的每个元素都可以单独分配一个值。例如,这是正确的:
myword[0] = 'B'; myword[1] = 'y'; myword[2] = 'e'; myword[3] = '\0'; |
☞ 字符串和字符数组
字符数组是C语言中用来表示字符串的典型类型(这就是为什么它们也被称为C风格字符串C-strings)。 在c++中,尽管标准库为字符串定义了特定的类型(string类),但是,字符数组(C-string)仍然是C++语言中表示字符串的自然方式; 事实上,字符串字面量总是作为字符数组,而不是字符串对象使用。
在标准库中,字符串的两种表示形式(字符数组和标准库字符串)并存,并且大多数需要字符串的函数都重载以同时支持这两种形式。
例如,cin和cout直接支持以空结尾的序列,允许它们直接从cin中提取或插入到cout中,就像字符串一样。例如:
// strings and NTCS: #include <iostream> #include <string> using namespace std; int main () { char question1[] = "What is your name? "; string question2 = "Where do you live? "; char answer1 [80]; string answer2; cout << question1; cin >> answer1; cout << question2; cin >> answer2; cout << "Hello, " << answer1; cout << " from " << answer2 << "!\n"; return 0; } |
What is your name? Homer Where do you live? Greece Hello, Homer from Greece! |
在本例中,使用了字符数组和字符串。它们与cin和cout一起使用时是可以互换的, 但它们声明的时候有一个显著的不同:数组有固定的大小,声明时需要隐式或显式指定; Question1的长度正好是20个字符(包括结束的空字符),answer1的长度是80个字符; 然而字符串只是普通字符串,没有指定大小.这是因为字符串的动态大小是在运行时确定的, 而数组的大小是在程序运行之前编译时确定的。
在任何情况下,字符数组和字符串都可以轻易地相互转换:
字符数组可以隐式转换为字符串,字符串可以通过使用string的成员函数c_str或data转换为字符数组:
char myntcs[] = "some text"; string mystring = myntcs; // convert c-string to string cout << mystring; // printed as a library string cout << mystring.c_str(); // printed as a c-string |