char s[] 与 char *s 的区别?

sunloverkun 2010-12-24 08:23:34
大家好,我有个问题无法解决,请大家指教。
问题:将一个字符串中的每一个字母变为其下一个字母,例如字符串“abcd”将变为“bcde”。
正解:

int main(int argc, char* argv[])
{

char str[]="abcd";

for(int i=0;str[i];i++)
{
if(str[i]=='z')
str[i]='a';
else
str[i]++;
}

printf("%s\n",str);

return 0;
}

编译程序后,结果为“bcde”,运行正常。
错解:
如果我使用如下代码:

int main(int argc, char* argv[])
{

char *str="abcdef";

for(int i=0;str[i];i++)
{
if(str[i]=='z')
str[i]='a';
else
str[i]++;
}

printf("%s\n",str);

return 0;
}

程序编译无错,但执行出错。经单步调试后,发现当使用 char *str=“abcd”定义后,str[i]++ 这句话有错误。
问题:
char str[]和char *str 有何区别?我一直认为它们都可以当做数组来处理,其中的每个字符都可以当做数组元素来处理,那么出现上述问题该如何解释?谢谢大家解决我的困惑。
...全文
137 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunloverkun 2010-12-25
  • 打赏
  • 举报
回复
想不到有那么多热心的朋友帮忙解答,现在我已经弄清楚些了。谢谢大家!尤其是“yuppy”,谢谢你快速而准确的解答!
newfinder 2010-12-24
  • 打赏
  • 举报
回复
楼主可以看下内存的分配方式.
http://topic.csdn.net/u/20090711/06/f4c19496-4885-44e1-aa25-0c247a128fc2.html

《C缺陷与陷阱》中有一段,对于一个数组,我们只能做两件事:确定其大小,以及获得指向该数组第一个元素的指针.其他操作都是通过指针进行的.数组名只有在sizeof运算中代表整个数组,其他所有情况中数组名代表首元素的地址.即指向第一个元素的指针.
prohibit 2010-12-24
  • 打赏
  • 举报
回复
char str[]="abcd";//数组str在栈上
char *str="abcdef";//指针str在栈上,字符串常量"abcdef"在静态存储区的只读数据区,不能修改
赵4老师 2010-12-24
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
hl0702xin 2010-12-24
  • 打赏
  • 举报
回复
"abcd"字符串常量,不能修改`楼主
luciferisnotsatan 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yuppy 的回复:]

char str[]="abcd"; 这个存在栈里
char *str="abcdef"; 这个在只读存储区

搂主可以google下 c 字符串常量~ 看完就很清楚了
[/Quote]
+1

char str[]="abcd";这个是给数组做初始化
char *str="abcdef"; 这个是指针指向字符串
heshanxingzhe 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yuppy 的回复:]
char str[]="abcd"; 这个存在栈里
char *str="abcdef"; 这个在只读存储区

搂主可以google下 c 字符串常量~ 看完就很清楚了
[/Quote]

顶!
  • 打赏
  • 举报
回复
字符串常量不可修改!
yuppy 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijun84 的回复:]
引用 2 楼 yuppy 的回复:

char str[]="abcd"; 这个存在栈里
char *str="abcdef"; 这个在只读存储区

搂主可以google下 c 字符串常量~ 看完就很清楚了


程序所有被赋值的相同串都会使用一个地址。
如: char *str="abcdef";
char *str1="abcdef";
char *str2="abcd……
[/Quote]
vc我代码里试了下,并不是同一个地址阿?
liuintermilan 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yuppy 的回复:]
char *str="abcdef";
是字符串常量~ 不可以修改
[/Quote]
+1
如果你的str是开辟了一个7个字节的空间,然后strcpy(str, "123456")这个是可以的。你在做任何修改也是可以的。
cap77 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yuppy 的回复:]
char *str="abcdef";
是字符串常量~ 不可以修改
[/Quote]
正解
wolftop 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yuppy 的回复:]

char str[]="abcd"; 这个存在栈里
char *str="abcdef"; 这个在只读存储区

搂主可以google下 c 字符串常量~ 看完就很清楚了
[/Quote]

程序所有被赋值的相同串都会使用一个地址。
如: char *str="abcdef";
char *str1="abcdef";
char *str2="abcdef";

它们都指向同一个内存地址
yuppy 2010-12-24
  • 打赏
  • 举报
回复
char str[]="abcd"; 这个存在栈里
char *str="abcdef"; 这个在只读存储区

搂主可以google下 c 字符串常量~ 看完就很清楚了
yuppy 2010-12-24
  • 打赏
  • 举报
回复
char *str="abcdef";
是字符串常量~ 不可以修改

69,368

社区成员

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

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