C++ char a[] char *a
阿新 • • 發佈:2019-01-07
舉例:
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++); 修改。。