學過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風格的字符串真的不好用。