一个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);
以上代码哪里有问题?具体分析。谢谢。
展开
 我来答
百度网友c0588c1
2013-06-25 · TA获得超过522个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:65万
展开全部

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;
}
三范式
2013-06-25
知道答主
回答量:6
采纳率:0%
帮助的人:8711
展开全部
luxinmu1 的答案很有道理
第一行 p指向了只读的内存空间,
第二行打印 AAA
第三行对p指向的内存空间修改时会报段错误
假如忽略第三行,下面p++是可以的,然户会打印出 AA
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
秋瑟瑟1992
2013-06-25
知道答主
回答量:24
采纳率:0%
帮助的人:20.7万
展开全部
指针的定义和赋值 char *p;&p="AAA";printf("%s",*p);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式