不同点
- 定义
char* a这个a是变量, 可以修改
char b[]这个b是常量, 不能改变
内存空间
没有开辟空间1 2 3
| char* str; scanf("%s", str); printf("%s", str);
|
这里在C primer plus上看到,这里的参数是个未初始化的指针,str会指向任何地方。所以,有可能会scanf改写某个地址上的值,从而擦掉程序中的代码。导致程序异常结束。
开辟空间1 2 3
| char* st; st = "hello"; printf("%s", st);
|
字符串的几种输入
这种形式不行(关键理解,数组的形式中str是常量)
1 2 3
| char str[10]; str = "ferry"; // str被看作(数组的地址而且是个常量)(不同于char * str,str是个指针变量)
|
1 2 3
| char s[10]; scanf("%s", s); //可以读入 printf("%s", s);
|
1 2 3 4 5 6 7 8 9
|
int main() { char str[10]; strcpy(str, "ferry"); printf("%s\n", str); return 0; }
|
关联点输出问题
1 2 3
| char str[10] = "ferry"; printf("%s\n", str); //字符串的地址=首元素的地址(传地址才能打出整个字符串) printf("%c\n", *str); //首元素的值
|
数组输入的本质
字符串是在静态存储区,而数组是独立分配,所以是把字符串copy到数组。
此时的字符串有两个副本。一个在静态存储区的字符串字面量,另一个是存储在str数组中的字符串。
有关内存区域
存储类别
存储区域