Abstract
C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢?
Introduction
char *s = "Hello World";
皆宣告了s字串,在C-style string的函數皆可使用,但兩者背後意義卻不相同。
的s是個char array,含12個byte(包含結尾\0),"Hello World"對s來說是initializer,將字元一個一個地copy進s陣列。
的s是一個pointer指向char,由於"Hello World"本身就是一個string literal,所以s指向"Hello World"這個string literal的起始記憶體位置。
做個簡單的實驗證明兩者不同
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
執行結果
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
s1是陣列,所以佔了12 byte,而s2只是pointer,所以佔了4 byte,實驗結果與預期相同。
實際使用有什麼不同嗎?兩種寫法皆可使用substring和pointer寫法,但只有char *s可以直接使用*s++寫法。
char s[]
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
18
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
執行結果
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
char *s
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
執行結果
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
但卻只有char *s可以使用*s++寫法。
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
11
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
執行結果
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
理由何在呢?
char s[]為陣列,雖然s = &s[0],但s是『常數』,恆等於&s[0]無法改變,但char *s為pointer,指向s[0],但卻是變數,可以任意改變,故可用*s++任意更改pointer值。
Conclusion
一般人很少分辨char s[]和char *s的差異,大部分狀況下用法相同,但char *s速度略快,因為不需copy的動作,且*s++為C語言常用的寫法,只有char *s才支援。
http://www.cnblogs.com/oomusou/archive/2007/03/04/663234.html