我對字符數組/字符串/字符指針的理解!

我對字符數組/字符串/字符指針的理解!

說到c語言的字符串以及指針字符串,還有字符數組等,開始學習有點懵。
不過一步一步學來也慢慢理解。
首先說字符:
定義一個字符變量:
char c;
賦值:
  c='a';//也可以這樣賦值:scanf("%c",&c);或者這樣賦值: c=getchar();
然後輸出:
  printf("%c",c);
當然也可以這樣輸出:
  printf("%d",c);//輸出字符的十進制;
另一個函數的輸出:
  putchar(c);//一次好像只能輸出一個字符;
//==================================================================================
下面說說通過指針變量給字符變量賦值
同樣定義一個指向字符的指針:
  char *cp;
  char c;
  cp=&c; //將c的地址存入指針變量cp,因爲cp是指針變量,所以cp只能存儲變量的地址;
通過指針給變量c賦值:  
  scanf("%c",cp);//因爲cp是指向c的一個指針變量,它存儲的是c的地址,所以cp前面不用添加取地址符號"&"
                 //特別要注意的是:通過指針給c賦值之前,一定要將c的地址賦值給cp
  printf("%c/n",*cp);
//====================================================================================
說完字符與字符指針,接着聊聊字符數組
例如:
     char a[3]={'a','b','c'};//下標也可以省略
     int i;
     //sizeof(a)獲得數組的總字節數,sizeof(a[0])獲得數組元素的字節數。
     //c語言了好像沒有獲得數組長度的函數(剛開始學,還找了好半天,哈哈)。不像javascript中length屬性就可以獲得數組大小
     for(i=0;i<sizeof(a)/sizeof(a[0]);i++)

     {
        printf("%c/n",a[i]);
     }
  接着看看指針與字符數組之間的關係:
  定義一個指針:
   char *p;
   讓指針p指向數組:
   p=a;//c語言規定:數組名就是數組的首地址;當然也可以這樣複製:p=&a[0];因爲a[0]表示數組的第一個元素的值,那麼&a[0]就表示數

組的首地址;
   然後用指針來輸出數組各元素的值:
     for(;p<a+3;p++)
     {
        printf("%c/n",*p);
     }
   //剛開始我不明白,爲什麼a不能a++,經過學習才知道,a在這裏是常量,所以就不能改變!
   假如我這樣輸出:
  printf("%s",p);
   輸出結果:abcw
  爲什麼會輸出abcw,而不是abc
  爲什麼要這樣: printf("%s",p); 而不是這樣: printf("%s",*p);
  我是這樣理解的:
   printf("%s",*p)之所以錯誤:
   原因有兩點,第一,%s表示輸出的是字符串,而c語言沒有字符串這個基本類型, c語言就規定了字符串的表示是字符數組的末位元素

以'/0'結束的字符數組;那麼字符串abc定義應該爲: char a[4]={'a','b','c','/0'};
   第二:printf("%s",*p)中的*p表示p所指向字符數組的第一個元素值'a',,而%s要求以'/0'結束,這樣就出現了矛盾,導致錯誤!
        假如我將字符數組的定義改爲:char a[1]={'/0'};然後用printf("%s",*p)去測試一下(這個大家可以測試一下)哈哈!
//=============================================================================================
寫代碼過程當中,字符串經常用到,特別是字符串數組。
如果你寫過JavaScript或者ActionScript:字符串數組經常用也比較容易:
例如:
   js: str=new Array()
        str.push("abc")
        str.push("efg")
如果按照c語言語法要求:假如要定義一個字符串數組:
    char  title[5][20]={"id","用戶名","登錄名","密碼"};
  這樣的定義看起來比較麻煩,而且要浪費空間(第二維的下標必須是所定義的字符串中長度最大的一個);
這時,就要用到指針數組:
    char *p[4]={"id","用戶名","登錄名","密碼"};
   說實話,我剛開始對這樣的定義很是納悶,爲什麼?! 我總是認爲:既然定義的是指針數組,那數組中的內容爲什麼不存放指針變量?
後來一想,明白了!(如果還不明白,就慢慢想,還是不明白,就回頭看看前面的內容),我想就一切明白了!哈哈!
  算了,不寫了!以後有空,再寫點心得。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章