请教:指向字符串的指针为何不能用来修改此字符串(c语言)

lein_wang 2010-06-07 02:49:28
各位大侠:

我原本打算使用指向一个字符串的指针来修改这个字符串,代码如下:
char *m = "hello";
*(m+1) = 's';
for(;*m != '\0';m++){
printf("%c\n",*m);
}

但是出运行时错误。
----------------------------------------------------------
我用数组下标的方式是可以修改的:
int i = 0;
char w[] = "hello";
w[1] = 's';

while(w[i] != '\0'){
printf("%c\n",w[i]);
i++;
}

----------------------------------------------------------
请大侠赐教为什么使用指针不能修改指向的这个字符串呢,谢谢!
...全文
731 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-06-07
  • 打赏
  • 举报
回复
指针可以指向常量
不过常量的内容还是不能修改啊
ForestDB 2010-06-07
  • 打赏
  • 举报
回复
指针哪里都能指,不过你碰巧指向了不可更改的地方。
ccdxjjxy 2010-06-07
  • 打赏
  • 举报
回复
学习了。。。好贴
yiruirui0507 2010-06-07
  • 打赏
  • 举报
回复
char *m = "hello";
"hello"保存在文字常量区,该数据不能修改,默认有只读属性.
由指针m指向. 不能通过指针m来修改此值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
liutengfeigo 2010-06-07
  • 打赏
  • 举报
回复
多来CSDN吧,经常见这个问题
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 huanmie_09 的回复:]

char *m = "hello";
"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
[/Quote]


正解!

字符串“hello”本身就是一个常量字符指针,而对于指针m,无非就是一个地址的拷贝,也就是“hello”地址的拷贝,相当于m指向一个字符串常量,字符串常量是不予许改变的!

而对于w[]来说就不一样了,虽然hello本身是常量,不过此时拷贝给w[]的不是地址,而是内容,也就是“hello”,也就是w本身拥有一个自己的hello副本,可以对其进行想要的合法操作,比如改变等!!

rwjlqn 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 konta 的回复:]
有种东西叫字符串常量,理解为只读
[/Quote]

用户 昵称 2010-06-07
  • 打赏
  • 举报
回复
楼主绕住了。
gundamy 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lein_wang 的回复:]
既然是一个常量,为什么指针可以指向一个常量呢?
[/Quote]

没人说指针不可以指向常量吧
huanmie_09 2010-06-07
  • 打赏
  • 举报
回复
char *m = "hello";
"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
pengzhixi 2010-06-07
  • 打赏
  • 举报
回复
char *m = "hello";<=>const char*m="hello";
lein_wang 2010-06-07
  • 打赏
  • 举报
回复
既然是一个常量,为什么指针可以指向一个常量呢?
konta 2010-06-07
  • 打赏
  • 举报
回复
有种东西叫字符串常量,理解为只读
gundamy 2010-06-07
  • 打赏
  • 举报
回复
char *m = "hello";这个是常量,不能修改

69,393

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧