1. C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢?
char str[] = "Hello World"; char *s = "Hello World";
char str[] = “Hello World";
是一個char array,是array,所以sizeof的大小會是12byte。
有12個byte(包含結尾\0),
“Hello World"對s來說是initializer,
將字元一個一個地copy進s陣列。
char str[] = "hello"; str = "world"; // error, incompatible types in assignment
如果使用陣列的方式宣告字串,則不可以直接使用 = 指定運算子另外指定字串。
char *s = “Hello World";
是一個pointer指向char,是pointer,所以sizeof(*s)的大小會是1byte。
由於"Hello World"本身就是一個string literal,
所以s指向"Hello World"這個string literal的起始記憶體位置。
這樣的宣告方式只宣告了指標,但是並沒有實體位置。
char *s = new char [strlen("hello") + 1];
只有char *s可以直接使用*s++寫法。
char s[]為陣列,雖然s = &s[0],但s是常數
但char *s是pointer,指向s[0],但卻是變數,可以任意改變,故可用*s++任意更改pointer值。
2. 指標陣列
在字元指標中使用指標陣列,可以更方便地處理字串陣列,例如:
#include <stdio.h> int main(void) { char *str[] = {"professor", "teacher", "student", "etc."}; for(int i = 0; i < 4; i++) { puts(str[i]); } return 0; }
下面兩個宣告的作用雖然類似,但其實意義不同:
char *str1[] = {"professor", "Justin", "etc."}; char str2[3][10] = {"professor", "Justin", "etc."};
char *str1[]
是使用指標陣列,每一個指標元素指向一個字串常數,只要另外指定字串常數給某個指標,該指標指向的記憶體位址就不同了。
char str2[3][10]
是配置連續的 3×10 的字元陣列空間,字串是直接儲存在這個空間,每個字串的位址是固定的,而使用的空間也是固定的(也就是含空字元會是10個字元)。
—
Reference:
[1]. (原創) char s[]字串和char *s字串有什麼差別? (C/C++) (C)
http://www.cnblogs.com/oomusou/archive/2007/03/04/663234.html
[2]. 字串反轉-範例練習(錯誤發掘&修正)
http://dannysun-unknown.blogspot.tw/2015/03/blog-post_10.html
[3]. 指標與字串
https://openhome.cc/Gossip/CGossip/PointerAndString.html