日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符串数组 和 字符串指针 的区别

發布時間:2025/1/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串数组 和 字符串指针 的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在C語言中,對字符串的操作主要有兩種方式,一是使用字符數組,char str[];二是使用字符指針。那么二者有什么區別呢?下面將分述二者的使用,最后進行比較。


一、字符數組

? ? ? ? 使用char str[]定義一個字符數組str,中括號內可以寫上數字表示數組大小,也可以不寫。如果不寫數字,則必須為字符數組提供初始值,以便編譯器進行內存分配。

可以使用字符串字面值(string literal)來初始化字符數組,也可使用字符字面值(character literal)初始化,如:

[cpp]?view plain?copy ? ?
  • char?str1[10]="Hello";??
  • char?str2[]="World";??
  • char?str3[]={'H','e','l','l','o'};??

  • 只能對字符數組元素的賦值,而不能用賦值語句對整個數組賦值,如:

    [cpp]?view plain?copy ? ?
  • char?str4[10];??
  • str4={'H','e','l','l','o'};????//?錯誤??
  • str4="Hello";??????????????????//?錯誤??
  • str4[0]='H';str4[1]='e';str4[2]='l';str4[3]='l';str4[4]='o';???//?正確??

  • 可以使用循環將字符數組中的字符一個一個輸出,也可以使用cout<<str1直接輸出整個數組。

    需要注意的是,上述代碼中str1和str2是C風格字符串,而str3不是。C風格字符串,是指以\0結尾的字符數組。C++為了兼容C,而保留了C中字符串的使用方法。

    str1和str2使用字符串字面值進行初始化,字符串字面值使用\0表示字符串結束。因此str2長度為6,需要將\0計算在內。使用strlen函數,計算的是字符串的實際長度,不包含\0。

    而str3則不一樣,它沒有\0作為結束標志,因而不是C風格字符串,使用cout<<str3可能會出現意想不到的結果。


    二、字符指針

    可以使用char *str指向一個字符串。如:

    [cpp]?view plain?copy ? ?
  • char?*ptr="C++";??
  • char?strArr[]="C++";??
  • char?*ptr2=strArr;??

  • 使用cout<<ptr即可輸出整個字符串,而使用cout<<*ptr則輸出字符串的首字符。

    字符指針也可指向C風格字符串,如ptr就是指向的C風格字符串。如果讓ptr指向上節中的str3,輸出ptr會出現同樣的意想不到的結果。畢竟數組名其實就是一種指針。


    三、區別

    前面簡單介紹了一下兩種操作字符串的方法,這部分進行比較,是本文的重點。如下代碼:

    [cpp]?view plain?copy ? ?
  • char?s[]="abc";??
  • char?*ptr="abc";??
  • cout<<s<<endl;???????????????//?abc??
  • cout<<*s<<endl;??????????????//?a??
  • cout<<&s<<endl;??????????????//?地址??
  • cout<<(s+1)<<endl;???????????//?bc??
  • cout<<*(s+1)<<endl;??????????//?b??
  • cout<<&s[1]<<endl<<endl;?????//?a??
  • cout<<ptr<<endl;?????????????//?abc??
  • cout<<*ptr<<endl;????????????//?a??
  • cout<<&ptr<<endl;????????????//?地址??
  • cout<<(ptr+1)<<endl;?????????//?bc??
  • cout<<*(ptr+1)<<endl;????????//?b??
  • cout<<&ptr[1]<<endl;?????????//?a??
  • 這些代碼應該能夠說明char s[]和char *ptr之間的相似點了。它們都是指向字符串的指針。

    下面說二者的不同之處。如下一段代碼:

    [cpp]?view plain?copy ? ?
  • char?ss[]="C++";??
  • ss[0]='c';??????????????????//?合法??
  • char?*p="C++";??
  • p[0]='c';???????????????????//?合法但不正確??
  • 該段代碼在VS2010下編譯可以通過,但是運行時程序會停止工作,為什么呢?原因在于p[0]='c'這一語句。該語句試圖修改p指向的字符串的首個字符,出現了錯誤。

    原因在于兩種方式對字符數組操作的機制不同。使用char *p="C++"語句后,編譯器在內存的文字常量區分配一塊內存,保存”C++“這一字符串字面值,然后在棧上分配內存保存p,p的內容為"C++"的地址。p[0]='c'試圖修改常量”C++“,程序當然就會崩潰了。而char ss[]="C++"語句,定義了一個數組,編譯器為其在棧上分配了內存空間,因而可以進行修改操作。

    因此,可以總結如下:

    (1)char ss[]定義了一個數組,ss可認為是一個常指針,ss不可改變,但ss指向的內容可以發生改變。

    (2)char *p定義了一個可變指針,p可以指向其它對象。但對于char *p=”abc“這樣的情況,p指向的是常量,故內容不能改變。


    如下代碼進一步說明char ss[]和char *p的區別:

    [cpp]?view plain?copy ? ?
  • char?*strA()??
  • {??
  • ????char?str[]="Hello";??
  • ????return?str;??
  • }??

  • 調用該函數,不一定能夠得到正確的結果。因為str定義了一個局部數據,是局部變量,存在于函數strA中的棧幀中。當函數調用完成后,棧幀恢復到函數strA調用前的狀態,臨時空間被重置,為函數分配的棧空間被收回,str所指向的地址也就不存在了。

    將上述代碼修改:

    [cpp]?view plain?copy ? ?
  • char?*strA()??
  • {??
  • ????char?*str="Hello";??
  • ????return?str;??
  • }??

  • 該函數能夠正常運行,因為str指向的字符串字面值被保存在只讀的數據段,是全局的,當函數調用完成后,str指向的地址未發生變化。

    綜上,可以看出使用char []較容易出錯,可能出現不確定的結果。C++提供的string類相比之下,要安全的多了。

    總結

    以上是生活随笔為你收集整理的字符串数组 和 字符串指针 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。