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。
運行結果和上面的一樣: