| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 311 人关注过本帖
标题:C语言,关于字符串的小问题!求高手解答,谢谢!!谢谢!!
只看楼主 加入收藏
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
结帖率:80%
收藏
已结贴  问题点数:10 回复次数:7 
C语言,关于字符串的小问题!求高手解答,谢谢!!谢谢!!
char *p="abcde";
p[0]='b';                   //这条语句有错误吗??求高手帮忙看看,指点一二,谢谢了!!
printf("%s",p);
搜索更多相关主题的帖子: 字符串 C语言 
2012-11-22 12:07
BMN李
Rank: 2
等 级:论坛游民
帖 子:15
专家分:39
注 册:2012-11-21
收藏
得分:0 
char p[]="abcde";
p[0]='b';                  
printf("%s",p);
同学这样可以不?
2012-11-22 13:14
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:3 
书上都说过 你这种写法的字符串属于不可以改的

char a[] = "aa";

这样的才是可以改的 虽然楼主的写法在某些时候可能对 但毕竟是跟环境和编译参数有关系的
2012-11-22 13:16
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:7 
这样不可以!因为在你的进程中,字符串常量“abcde”存在于常量存储区,而指针p正好指向这里,是不可能改变的
所以是错误的
但是你可以先定义一个数组,这可空间是在栈上分配,用常量字符串初始化,相当于一个副本,因此可以改变,但是改变后
原来的常量区的数据没变,因为它是不会改变的

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2012-11-22 16:38
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
回复 4楼 liufashuai
你的意思是说用char *p="abcde";的时候,字符串是不可以修改的!
而char p[]="abcde";的时候,字符串也可以修改的!
对吗?我怎么觉得这两种定义方式等价的啊!
2012-11-22 22:28
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用weishen2011在2012-11-22 22:28:15的发言:

你的意思是说用char *p="abcde";的时候,字符串是不可以修改的!
而char p[]="abcde";的时候,字符串也可以修改的!
对吗?我怎么觉得这两种定义方式等价的啊!

还有一点就是为什么同一个字符串,用指针定义的时候在常量区,而用数组定义的时候在栈中呢?能稍微解释下吗?谢谢!!
2012-11-22 22:30
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用liufashuai在2012-11-22 16:38:02的发言:

这样不可以!因为在你的进程中,字符串常量“abcde”存在于常量存储区,而指针p正好指向这里,是不可能改变的
所以是错误的
但是你可以先定义一个数组,这可空间是在栈上分配,用常量字符串初始化,相当于一个副本,因此可以改变,但是改变后
原来的常量区的数据没变,因为它是不会改变的


你的意思是说用char *p="abcde";的时候,字符串是不可以修改的!
而char p[]="abcde";的时候,字符串也可以修改的!
对吗?我怎么觉得这两种定义方式等价的啊!

还有一点就是为什么同一个字符串,用指针定义的时候在常量区,而用数组定义的时候在栈中呢?能稍微解释下吗?谢谢!!
2012-11-22 22:31
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:0 
回复 7楼 weishen2011
这几天忙,没上线,不好意思!

这个就是这个意思:
"abcde"是一个常量字符串。当该进程执行的时候,它被读入内存,存放在内存布局的常量存储区(注意这一区域是不可改变的,以为是常量,有内存读取权限
但是没有写权限)

既然在内存中,这个字符串就会有一个内存地址,对吧。因此当你定义一个指针指向这个地址的时候,相当于指针指向了常量区,因此你肯定不能修改其中的数据
这个好理解吧!相当于 const int *p;(内容常量)

主要是数组这个东西。首先数组名字是一个常量指针!它不可以改变,但是数组是局部变量,是在栈上分配内存的。
而初始化相当于把常量字符串"abcde"赋值了一份。给栈上的数组填充赋值了(当然也有可能是一种映射)
但是这就说明这个常量指针(数组名字)不是指向常量区,也就没有常量属性,因此就可以修改了!相当于int * const p;(指针常量)

你可以读出指针和相应变量的地址来检测一下

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2012-11-27 15:30
快速回复:C语言,关于字符串的小问题!求高手解答,谢谢!!谢谢!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041422 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved