举例:
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++); 修改。。