理解char a[],char* a[],char** s


 

char str[6]="hello";
當編譯器遇到這句時,會把str數組中從第一個元素把hello\0 逐個填入。C語言中規定數組名代表數組所在內存位置的首地址,也是 str[0]的地址,即str = &str[0];
char str[6]="hello";
cout<<str<<" "<<str[0]<<endl;

運行結果是:

 

 為什么用首地址就可以輸出字符串,因為還有一個關鍵,在C語言中字符串常量的本質表示其實是一個地址。如果 "hello", 存儲在內存中的地址是 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 ,那么str其實是0x3000,”hello"在我們看來是字符串,但在編譯器看來是地址,即該字符串的首地址0x3000,所以cout<<str在編譯器看來就是要輸出整個字符串。

char *s="China";

為什么直接可以用字符串初始化char*型指針s,就是因為字符串在編譯器看來是地址,這無異於將字符串首地址賦給s。

 

char* a[]

char* a[3]={"chinese","japan","english"};
cout<<a[0]<<" "<<*a[0];

運行結果是:

 

 char* a[3]建立個數組,數組的元素皆為char*型指針,保存着字符串的首地址,前面講過字符串在編譯器看來就是地址,所以“chinese”,"japan","english"的首地址分別存放在a[0]、a[1]、a[2]中,當cout<<a[0]時,雖然a[0]是地址,但編譯器理解為字符串,直接將字符串輸出。*a[0]則明顯是字符串的第一個字符。

還有一個問題就是sizeof(a)為多少?因為數組中存放的是指針,指針大小在32位機中占4個字節,所以3個指針共占用了12字節,即sizeof(a)為12。

 

char** s

char* a[3]={"chinese","japan","english"};
char** s=a;
cout<<*s<<" "<<**s;

為什么a能賦給s?s是二級指針,即指針的指針,s存放着一級指針的地址,一級指針存放着字符串的地址。我們知道數組名是首元素的地址,所以a=&a[0],a[0]是char*型指針,所以a是char**型,所以可以賦給s。

運行結果和上面的一樣:

 


免責聲明!

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



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