1. 程式人生 > >C++ char a[] char *a

C++ char a[] char *a

舉例:

      char  *s ;

      s = "China";

      為什麼可以把一個字串賦給一個指標變數。。

      這不是型別不一致嗎???

      這就是上面提到的關鍵 。。

      C語言中編譯器會給字串常量分配地址,如果 "China", 儲存在記憶體中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 .

      s = "China" ,意識是什麼,對了,地址。

      其實真正的意義是 s ="China" = 0x3000;

      看清楚了吧 ,你把China 看作是字串,但是編譯器把它看作是地址 0x3000,即字串常量的本質表現是代表它的第一個字元的地址。。。。。。。。。。

      s = 0x3000

      這樣寫似乎更符合直觀的意思。。。

      搞清楚這個問題。。

      那麼 %s ,它的原理其實也是通過字串首地址輸出字串,printf("%s ", s);   傳給它的其實是s所儲存的字串的地址。。。

      比如

[cpp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片

#include <stdio.h>  
 int main()  
 {  
    char *s;  
    s = "hello";  
    printf("%p\n",s);  
    return 0;  
 }  
  可以看到 s = 0x00422020 ,這也是"China"的首地址

  所以,printf("%s",0x00422020);也是等效的。。



   字元陣列:

   char  str[10] = "hello";

   前面已經說了,str = &str[0] , 也等於 "hello"的首地址。。

   所以printf("%s",str); 本質也是 printf("%s", 地址");

    C語言中操作字串是通過它在記憶體中的儲存單元的首地址進行的,這是字串的終極本質。。。

5  char *  與 char  a[ ];

   char  *s;

   char  a[ ] ;

   前面說到 a代表字串的首地址,而s 這個指標也儲存字串的地址(其實首地址),即第一個字元的地址,這個地址單元中的資料是一個字元,

這也與 s 所指向的 char 一致。

  因此可以 s = a;

   但是不能 a = s;

   C語言中陣列名可以複製給指標表示地址, 但是卻不能賦給給陣列名,它是一個常量型別,所以不能修改。。

   當然也可以這樣:
char  a [ ] = "hello";  
char *s =a;  
for(int i= 0; i < strlen(a) ; i++)  
      printf("%c", s[i]);  
或  printf("%c",*s++);  修改。。