字符串數組與字符串指針


  這本來是前天寫的內容,一直拖到了現在,本來打算今天晚上寫,又怕拖到明天,現在寫了吧。該死的拖延症。

  在編程的時候這塊遇到好幾次問題。而且越看越糊塗,上網查了查,自己寫一寫,看看對不對。有雷同,有改進。

字符串數組與字符串指針的區別

  C中沒有字符串數據類型,一般使用數組對字符串進行各種操作。

(1)字符串指針

  字符串指針是定義了一個指針變量,指針變量存儲的是某個字符串的內存首地址。他是指針變量被放在內存中的棧區。在編譯器編譯時,會自動在字符串結尾處添加結束標識符'\0'。

(2)字符串數組

  字符串數組是用數組來存儲字符串。字符串數組作為變量存儲在內存中的棧區。C對於字符數組沒有硬性規定一定要在末尾處添加結束符,即可有可無。但好多字符串函數都是以結束符作為判斷的標志,所以要注意在使用字符數組時記得在末尾處添加結束符。

(3)關於字符串指針和字符串數組初始化的問題

  首先解釋字符串常量。字符串常量是這靜態存儲區中的一段連續的內存,以'\0'結束。只讀,不可修改。

  a.字符串指針初始化

  可使用字符串常量對指針初始化,如下所示:

    char *p = "hello world";

    或

    char *p; 

    p = "hello world";

  使用字符串常量對指針初始化時,指針是變量存儲在內存中的棧區,字符串常量存儲在靜態存儲區,不可修改,如果修改會出現未定義錯誤。例子:

    char *p = "hello world";

    *(p + 1) = 'E';               //這樣的賦值是錯誤的,不能更改字符串常量

  b.字符數組初始化

  可使用字符串常量對數組初始化,如下所示:

    char str[] = {"hello world"};

  也可以對數組單個元素初始化,如下所示:

    char str[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

  使用字符串常量對數組初始化時,數組作為變量存儲在內存中的棧區,字符串作為元素值被放在數組所分配的內存空間中。且可對數組元素進行修改。

    char str[] = {"hello world"};

    str[0] = ’H';             //這樣的操作是正確的

  (4)字符串數組中的結束符問題

  C對於字符數組沒有硬性規定一定要在末尾處添加結束符。

  a.當表明數組大小時,

    char str[4] = {"Good"};

  b.當未表明數組大小時,

    char str[] = {"Good"};

    即 char str[0] = {'G'}; char str[1] = {'o'}; char str[2] = {'o'}; char str[3] = {'d'}; char str[4] = {'\0'};

  上述是表明數組大小與未表明數組大小編譯器的方式

  (5)使用指針時要防止出現段錯誤,防止指針指向內存中不明空間。

  當一個指針變量在未取得確定地址前使用是危險的,容易引起錯誤。
  一個錯誤的例子,如下:       
           char *name;
           scanf("%s",name);
           printf("%s",name);
  有的編譯器雖然也能通過,但這是錯誤的,因為是個指針,定義時指向不可用的地址。解決這個問題有兩種方法:用數組的方法或給字符針針分配內存空間的方法。
    數組的方法:
                 char name[20];
                 scanf("%s",name);
                 printf("%s",name);
     
    給字符針針分配內存空間的辦法:
                 char *name;
                 name=(char*)malloc(50);      //此時name已經指向一個剛剛分配的地址空間。
                 scanf("%s",name);
                 printf("%s",name);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM