| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1015 人关注过本帖, 1 人收藏
标题:string *与string[]
只看楼主 加入收藏
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
结帖率:100%
收藏(1)
已结贴  问题点数:60 回复次数:10 
string *与string[]
#include<stdio.h>
#include<stdlib.h>
#define NUL '\0'

void reverse_string(char *string); // 将一个字符串转置

int main()
{
char *string="abcdefghijklm";
reverse_string(string);
puts(string);
return EXIT_SUCCESS;
}

void reverse_string(char *str)
{
char *last_char;
for(last_char=str;*last_char!=NUL;last_char++)
;
last_char--;
while(str<last_char)
{
char temp;

temp=*str;
*str++=*last_char; //这一行报错……
*last_char--=temp;
}
}
搜索更多相关主题的帖子: void include return 字符串 
2012-06-22 22:56
劣质数轴
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:163
注 册:2010-11-19
收藏
得分:9 
char * string = "abcdefghijklm";
这样声明的是字符串常量,位置处于只读区,是不可更改的。
如果是char  string[] = "abcdefghijklm";
这样的话,是分配在栈上,可以更改string的内容
2012-06-23 01:17
小糊涂神c30
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:198
专家分:809
注 册:2012-4-25
收藏
得分:9 
二楼说得对!
把char *string="abcdefghijklm";
改成char string[]="abcdefghijklm";
代码就没问题了!
2012-06-23 01:35
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:9 
char *string="abcdefghijklm"
比较要命的是,如果系统函数中刚好有这个字符串,你的代码也会修改它,因为编译器对字符串字面值只保留一个副本

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-06-23 08:09
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:9 
*string后string是二级指针
2012-06-23 10:10
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:0 
回复 5楼 lucky563591
char *string[];string 是二级指针;   char **string 也是二级指针;   那么前后两个string 有什么区别呢?
2012-06-23 10:31
震中地带
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:171
专家分:359
注 册:2012-3-26
收藏
得分:9 
回复 4楼 pauljames
什么意思,既然这是一个字符常量,存在只读取内,不可更改,意思就是这个代码不能起到作用,怎么会对同样的字符进行修改呢?
2012-06-23 10:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:9 
以下是引用回首依依在2012-6-22 22:56:50的发言:

#include
#include
#define NUL '\0'

void reverse_string(char *string); // 将一个字符串转置

int main()
{
char *string="abcdefghijklm";
reverse_string(string);
puts(string);
return EXIT_SUCCESS;
}

void reverse_string(char *str)
{
char *last_char;
for(last_char=str;*last_char!=NUL;last_char++)
;
last_char--;
while(str

那一行肯定报错了,参数类型都不一样。当你定义char *string="abcdefghijklm"的时候,它其实是const char *string="abcdefghijklm",string是常量指针,不容许修改其中内容,而你定义的函数reverse_string(char *str),str是普通指针,两个指针类型不同。你在reverse_string()中修改str的内容,在语法上是没问题的,因为str已被声明为普通指针,但实际运行时,传入的是const char*常量指针,此时就出错,因为常量指针不允许修改。

这是你没有养成正确的代码编写习惯。在写代码时,凡是像char *string="abcdefghijklm"这样的,都应该明显地写成const char *string="abcdefgijklm",不要依靠编译器的默认行为,这样自己用肉眼看,都能看到问题所在,如果编译器够好,应该会在函数头上或调用行处报警,指出实参和形参类型不匹配。char *string="abcdefghijklm"这种写法,绝对误导你以为string是普通的内存数组,可以随意修改内容的。

[ 本帖最后由 TonyDeng 于 2012-6-23 14:45 编辑 ]

授人以渔,不授人以鱼。
2012-06-23 14:31
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:9 
char * string = "abcdefghijklm";
这样声明的是字符串常量,位置处于只读区,是不可更改的。
如果是char  string[] = "abcdefghijklm";
这样的话,是分配在栈上,可以更改string的内容

学习了!
2012-06-23 14:49
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:0 
回复 8楼 TonyDeng
谢谢版主,受教了……
2012-06-23 15:43
快速回复:string *与string[]
数据加载中...
 
   



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

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