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。
运行结果和上面的一样: