一个C语言中指针型字符数组的问题
char*p="AAA";printf("%s",p);p[0]='B';p++;printf("%s",p);以上代码哪里有问题?具体分析。谢谢。...
char *p="AAA";
printf("%s",p);
p[0]='B';
p++;
printf("%s",p);
以上代码哪里有问题?具体分析。谢谢。 展开
printf("%s",p);
p[0]='B';
p++;
printf("%s",p);
以上代码哪里有问题?具体分析。谢谢。 展开
3个回答
展开全部
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;
}
展开全部
luxinmu1 的答案很有道理
第一行 p指向了只读的内存空间,
第二行打印 AAA
第三行对p指向的内存空间修改时会报段错误
假如忽略第三行,下面p++是可以的,然户会打印出 AA
第一行 p指向了只读的内存空间,
第二行打印 AAA
第三行对p指向的内存空间修改时会报段错误
假如忽略第三行,下面p++是可以的,然户会打印出 AA
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针的定义和赋值 char *p;&p="AAA";printf("%s",*p);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询