不同点

  • 定义
    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);

字符串的几种输入

  • 当以数据形式赋值时
    这种形式可以
1
char str[10] = "ferry";

这种形式不行(关键理解,数组的形式中str是常量)

1
2
3
char str[10];
str = "ferry";
// str被看作(数组的地址而且是个常量)(不同于char * str,str是个指针变量)
  • 以改变数组的内容输入(1)
1
2
3
char s[10];
scanf("%s", s); //可以读入
printf("%s", s);
  • 以改变数组的内容输入(2)
1
2
3
4
5
6
7
8
9
#include<stdio.h>
#include<string.h>
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数组中的字符串。

有关内存区域

存储类别
存储区域