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

使用字符串指針變量與字符數組的區別數組

(1)分配內存
  設有定義字符型指針變量與字符數組的語句以下:
  char *pc ,str[100];
  則系統將爲字符數組str分配100個字節的內存單元,用於存放100個字符。而系統只爲指針變量pc分配4個存儲單元,用於存放一個內存單元的地址。
(2)初始化賦值含義
  字符數組與字符指針變量的初始化賦值形式相同,但其含義不一樣。例如:
  char str[ ] ="I am a student ! " ,s[200];
  char *pc="You are a student ! " ;
  對於字符數組,是將字符串放到爲數組分配的存儲空間去,而對於字符型指針變量,是先將字符串存放到內存,而後將存放字符串的內存起始地址送到指針變量pc中。
(3)賦值方式
  字符數組只能對其元素逐個賦值,而不能將字符串賦給字符數組名。對於字符指針變量,字符串地址可直接賦給字符指針變量。例如:
  str="I love China! "; //字符數組名str不能直接賦值,該語句是錯誤的。
  pc="I love China! "; //指針變量pc能夠直接賦字符串地址,語句正確
(4)輸入方式
  能夠將字符串直接輸入字符數組,而不能將字符串直接輸入指針變量。但可將指針變量所指字符串直接輸出。
  例如: cin >> str //正確
         cin >> pc //錯誤
         cout<<pc //正確
(5)值的改變
  在程序執行期間,字符數組名錶示的起始地址是不能改變的,而指針變量的值是能夠改變的。      例如:    str=str+5; //錯誤
      pc=str+5; //正確
小結 字符數組s[100] 指針變量pc
  (1)分配內存 分配100個單元 分配4個單元。
  (2)賦值含義 字符串放到數組存儲空間 先將字符串存放到內存
  將存放串的首地址送到pc中。
  (3)賦值方式 只能逐個元素賦值 串地址可賦給pc
  (4)輸入方式: 串直接輸入字符數組 不能將字符串直接輸入指針變量
  (5)值的改變: 字符數組首地址不能改變 指針變量的值能夠改變
    由以上區別能夠看出,在某些狀況下,用指針變量處理字符串,要比用數組處理字符串方便。 

    用字符數組和字符指針變量均可實現字符串的存儲和運算。可是二者是有區別的。在使用時應注意如下幾個問題:

1.     字符串指針變量自己是一個變量,用於存放字符串的首地址。而字符串自己是存放在以該首地址爲首的一塊連續的內存空間中並以‘’做爲串的結束。字符數組是因爲若干個數組元素組成的,它可用來存放整個字符串。spa

2.     對字符串指針方式設計

char *ps="C Language";指針

能夠寫爲:內存

    char *ps;ci

ps="C Language";字符串

而對數組方式:編譯器

    static char st[]={"C Language"};編譯

不能寫爲:變量

    char st[20];

    st={"C Language"};

而只能對字符數組的各元素逐個賦值。

     從以上幾點能夠看出字符串指針變量與字符數組在使用時的區別,同時也可看出使用指針變量更加方便。

當一個指針變量在未取得肯定地址前使用是危險的,容易引發錯誤。
一個錯誤的例子,以下:       
           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);

可是對指針變量直接賦值是能夠的。由於C系統對指針變量賦值時要給以肯定的地址。

3.int  main()
{
 char str1[40]="hello world!";     //char *str1="hello world!";
 str1[4]='A';                      //若str1是指針型的,編譯經過,但運行是此處會段錯誤
 printf("%sn",str1);
 return 0;
}
關於「 str1[4]='A'; //若str1是指針型的,編譯經過,但運行是此處會段錯誤」這句的分析講的很是好,以下:
str1是指針型時,「hello world!」是一個字符串常量,放在內存裏,str1指向其內存地址。 什麼是字符串常量呢?就是咱們不能更改起內容的字符串。因此str1[4]='A';這樣賦值就會出錯。 至於爲何是運行出錯而不是編譯出錯,我想這是編譯器的問題。我用的是gcc編譯器,他可能並不知道str1指向的是一個字符串常量,咱們固然能夠設計本身的編譯器讓它識別這樣的錯誤使程序在編譯時就報錯。
相關文章
相關標籤/搜索