[转贴]char s[]字串和char *s字串有什么差別?

C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢?

Introduction

char  s[]  =   " Hello World " ;
char   * s   =   " Hello World " ;


皆宣告了s字串,在C-style string的函數皆可使用,但兩者背後意義卻不相同。

char  s[]  =   " Hello World " ;


的s是個char array,含12個byte(包含結尾\0),"Hello World"對s來說是initializer,將字元一個一個地copy進s陣列。

char   * =   " Hello World " ;


的s是一個pointer指向char,由於"Hello World"本身就是一個string literal,所以s指向"Hello World"這個string literal的起始記憶體位置。

做個簡單的實驗證明兩者不同

 1 None.gif #include  < iostream >
 2 None.gif
 3 None.gif using   namespace  std;
 4 None.gif
 5 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
 6InBlock.gif char s1[] = "Hello World";
 7InBlock.gif char *s2  = "Hello World";
 8InBlock.gif 
 9InBlock.gif cout << "size of s1: " << sizeof(s1) << endl;
10InBlock.gif cout << "size of s2: " << sizeof(s2) << endl;
11ExpandedBlockEnd.gif}


執行結果

None.gif size of s1:  12
None.gifsize of s2: 
4 None.gif


s1是陣列,所以占了12 byte,而s2只是pointer,所以占了4 byte,實驗結果與預期相同。

實際使用有什麼不同嗎?兩種寫法皆可使用substring和pointer寫法,但只有char *s可以直接使用*s++寫法。

char s[]

 1 None.gif #include  < iostream >
 2 None.gif
 3 None.gif using   namespace  std;
 4 None.gif
 5 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
 6InBlock.gif char s[] = "Hello World";
 7InBlock.gif 
 8ExpandedSubBlockStart.gifContractedSubBlock.gif for(int i = 0; i != 11++i) dot.gif{
 9InBlock.gif  cout << s[i];
10ExpandedSubBlockEnd.gif }

11InBlock.gif cout << endl;
12InBlock.gif 
13ExpandedSubBlockStart.gifContractedSubBlock.gif for(int i = 0; i != 11++i) dot.gif{
14InBlock.gif  cout << *(s + i);
15ExpandedSubBlockEnd.gif }

16InBlock.gif cout << endl;
17ExpandedBlockEnd.gif}

18 None.gif


執行結果

None.gif Hello World
None.gifHello World


char *s

 1 None.gif #include  < iostream >
 2 None.gif
 3 None.gif using   namespace  std;
 4 None.gif
 5 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
 6InBlock.gif char *= "Hello World";
 7InBlock.gif 
 8ExpandedSubBlockStart.gifContractedSubBlock.gif for(int i = 0; i != 11++i) dot.gif{
 9InBlock.gif  cout << s[i];
10ExpandedSubBlockEnd.gif }

11InBlock.gif cout << endl;
12InBlock.gif 
13ExpandedSubBlockStart.gifContractedSubBlock.gif for(int i = 0; i != 11++i) dot.gif{
14InBlock.gif  cout << *(s + i);
15ExpandedSubBlockEnd.gif }

16InBlock.gif cout << endl;
17ExpandedBlockEnd.gif}


執行結果

None.gif Hello World
None.gifHello World


但卻只有char *s可以使用*s++寫法。

 1 None.gif #include  < iostream >
 2 None.gif
 3 None.gif using   namespace  std;
 4 None.gif
 5 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
 6InBlock.gif char *= "Hello World";
 7InBlock.gif 
 8InBlock.gif while(*s) 
 9InBlock.gif  cout << *s++;
10ExpandedBlockEnd.gif}

11 None.gif
12 None.gif


執行結果

None.gif Hello World


理由何在呢?

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才支援。

Reference
C Primer Plus 5/e中文版 p.480

转载于:https://www.cnblogs.com/xxfighting/archive/2010/08/26/1809196.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值