C语言中的,字符数组名和字符指针的区别


#include <stdio.h>                   //第一行
int main()                                //第二行
{                                               //第三行                            
    char* a = "I am a teacher.";  //第四行
    *a = 'v';                                //第五行
    char b[] = "I am a teacher."; //第六行
    char* p=b;                             //第七行
    *p = 'v';                                //第八行
    printf("%s\n", a);
    printf("%s\n", b);
    return 0;
}

第五行是错误的,因为字符指针变量a指向字符串常量"I am a teacher."的第一个字符,字符串常量是不能改变的。
但是第八行,同样写法是给字符指针变量赋值,为什么第五行错,而第八行却是对的呢?第八行和第五行的格式一样啊,左边都是字符指针变量a(第五行)和p第八行。

第五行错误的原因是变量a指向一个常量字符串,赋值a是更改常量字符串的内容,所以错误。
第八行的b是在声明定义时,使用常量字符串初始化字符数组变量b,所以变量p指向的是b数组中的第一个元素,属于变量存储区域,所以赋值
p是正确的。

*p指向b,b是变量,变量是可修改的。

b是字符数组,它保存的字符串是字符串变量,可以被修改,也就是可以赋值。指针p只是指向了b的地址,不会改变b内存可修改的特性。