指针指向字符串

#include <stdio.h>
int main()
{
char *p="breadfruit";
char *p1;
p1=p;
*(p1+3)='b';
printf("%s\n",p);
return 0;
}
这程序什么地方不对?还有指针输出为什么用p而不是*p?
如果把 char *p="breadfruit";改成char p[]="breadfruit";好像就可以了,为什么呢?

题主问了两个问题:(1)题上程序哪里不对:编译没错,运行出错,因为char *p="breadfruit";p这个指针指向了静态内存区(可读不可写)里breadfruit字符串的首个字符。*(p1+3)='b';试图写入,所以运行出错。改成char p[]="breadfruit";就可以对字符串进行修改是因为这个字符串是自己定义的本地变量,随便改。主要是因为两种写法的字符串存放位置不同,想改字符串的话都要用第二种写法。
(2)指针输出为什么用p而不是*p:教材上字符串的输入输出一节上讲的很清楚。用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名(也就是字符数组的起始地址,强调地址)。现在指针p指向了字符数组的第一个字符,然后是这样执行的:按P中地址找到其字符数组首个字符,然后逐个输出其中的字符,直到遇到“\0”为止。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-14
char *p="breadfruit"; 意思是定义一个char*的指针,该指针的值是,静态内存区 “breadfruit”的首地址,这片内存是不可写的!

不知你看明白了没?

你补充的很好 。。。
char p[]="breadfruit";
就是定义一个数组,该数组拥有11个字节的空间,这片空间可以自由读取。本回答被提问者采纳
第2个回答  2010-07-25
#include <stdio.h>
int main()
{
char *p="breadfruit";
char *p1;
p1=p;
*(p1+3)='b';
printf("%s\n",p);
return 0;
}
你的程序是对的吧!我运行了一下结果是:brebdfruit就是这个结果啊!你把第四个a换成了b,对的啊? 你说的那个为什么是p而不是*p,那是因为你的格式是%s,是字符串的输出格式,后面是地址。在指针里而p就表示的一个地址。希望可以帮到你
第3个回答  2020-12-26

第五十六集 指针指向字符串

相似回答