http://www.cnblogs.com/oomusou/archive/2007/03/04/663234.html char s[]字串和char *s字串有什麼差別? (C/C++) (C)Abstract char s[] = "Hello World"; char *s = "Hello World";
char s[] = "Hello World";
char *s = "Hello World";
1 ![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]()
![]() ![]() ![]()
實際使用有什麼不同嗎?兩種寫法皆可使用substring和pointer寫法,但只有char *s可以直接使用*s++寫法。 1 ![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]() 12 ![]() 13 ![]() 14 ![]() 15 ![]() 16 ![]() 17 ![]() 18 ![]()
![]() ![]()
1 ![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]() 12 ![]() 13 ![]() 14 ![]() 15 ![]() 16 ![]() 17 ![]()
![]() ![]()
1 ![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]() 12 ![]()
![]()
char s[]為陣列,雖然s = &s[0],但s是『常數』,恆等於&s[0]無法改變,但char *s為pointer,指向s[0],但卻是變數,可以任意改變,故可用*s++任意更改pointer值。 Conclusion Reference 我想原發問者可以這樣理解: 1) 嚴格來說 C 語言本身並沒有什麼字串,字串只存在人的心裡。說穿了你只是拿一種比較小的整數陣列來存放字碼,至於尾端加 '\0' 則是一種古時候傳下來的使用習慣(當然,當所有人、包含標準程式庫都這麼做的時候,你不跟就會很難過)。 如果你去看比較咬文嚼字的「法典」,你會發現裡面不太講「字串」,只稱 char array,而 string 出現大多是因為 string literal。 2) char 是一種整數,char 陣列和 int 陣列的行為無差別,除了可以用 string literal 初始化 3) 字元常數(Character constants):亦即用 ' ' 包夾的東西,在 C/C++ 當中字元常數被視為一種整數,和 66、99 這些數值沒有差別。有趣的是,假如你用 C 語言的話字元常數型別應該是 int,在 C++ 則是 char。 你可以寫 char s[] = {65, 66, 67}; 也可以寫 char s[] = {'A', 'B', 'C'}; 如果希望符合其他人對字串的期待,最好加'\0' char s[] = {'A', 'B', 'C', '\0'}; 4) String literal:亦即用 " " 包夾的東西。通常你可以將 string literal 想成一種特殊的字元陣列,自動以 '\0' 收尾,而且存放在某個不能修改的記憶體裡面。 由於 string literal 也是陣列(嚴格來說是陣列的位址),所以這樣是完全合法的: char c = "abc"[1]; // c 被初始化為 'b' 但你不能修改內容: "abc"[0] = 'x'; 你可以用指標去指向一個 string literal,和你用指標去指其他陣列一樣,但是注意在 C++ 下 string literal 具有 const 屬性 char* str = "string literal"; // 不好的寫法,C++編譯器會拒絕 char const *str = "string literal"; // 嚴謹的寫法 所有的陣列都可以用 {...} 初始化,但 C/C++ 特許字元陣列用 string literal 代替 {...} 初始化 char s[] = "ABC"; 完全等於 char s[] = {'A', 'B', 'C', '\0'}; 這是在本地建立陣列並初始化,所以未來可以修改內容。和前面用指標指向唯讀的 string literal 意義完全不同。 ----- 結論:字串只是一種使用慣例罷了,你只要理解字元陣列和 string literal 就可以了。 |
prog | Programming > prog.lang | C++ >