2025-03-02 05:14:20
char *p=“AAA”; //初始化一个指向字符串的指针(指向字符串其实是指向字符串的第一个字符)
注意,上面说的是指向字符串常量!
p[0]='B'; //不允许
这会导致内存访问错误。原因在于编译器可能选择内存中的同一个单个的拷贝,来表示所有相同的字符串文字。
给你举个例子:
char message1[] = “hello”; //1式
char*message2 = “hello”; //2式
两个hello有什么不同呢? 用于初始化一个字符数组时,它就是一个初始化列表。例如1式。在其他地方时,它都表示一个字符串常量。例如2式。
这两个初始化有不同的含义。前者初始化一个字符数组的元素,而后者是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置。
故你不能给一个常量赋值,C语言中,可以作为左值,也就是可以被赋值的不能为常量!
再深入一点儿,字符串常量属于静态存储(static)类。静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,该字符串在程序的整个运行过程中只存储一份。整个引号中的内容作为指向该字符串存储位置的指针。
故p[0]='B'; 是不允许的。
可以修改为下:
#include <stdio.h>
int main()
{
char str[]="AAA";
char *p = str;
printf("%s\n",p);
p[0]='B';
p++;
printf("%s\n",p);
return 0;
}
2025-03-02 08:43:40
2025-03-02 08:18:46