| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2427 人关注过本帖
标题:'\0'可以赋值给char *?为什么?
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
结帖率:94.64%
收藏
已结贴  问题点数:10 回复次数:8 
'\0'可以赋值给char *?为什么?
如题所问.
2011-01-31 14:52
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
感觉不行吧,一个是 char 一个是 char * 类型应该不匹配呀。
2011-01-31 15:44
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 2楼 pangding
是啊,用'\0'赋值给char * 编译和运行都可以,但用'a'或'\n'赋值给char * 编译就报错,我用的编译器是VS2010,跟C++标准不是蛮接近的吗?

My life is brilliant
2011-01-31 16:06
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:3 
图片附件: 游客没有浏览图片的权限,请 登录注册

VC6倒是可以

只是VC不是最标准的C++
2011-01-31 20:21
zqmillet
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:108
注 册:2008-7-20
收藏
得分:0 
VC2010也可以啊……
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-01-31 20:27
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
你们写的并不是赋值给 char *。
你们那种写法应该是没问题的。

楼主说的应该是类似这样的:
char *p;
p = '\0';

当然这种做法本身很愚蠢,不过探究一下語法上通不通倒可以。应该是不符合語法,我觉得。
2011-02-01 00:05
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
以下是引用lz1091914999在2011-1-31 16:06:43的发言:

是啊,用'\0'赋值给char * 编译和运行都可以,但用'a'或'\n'赋值给char * 编译就报错,我用的编译器是VS2010,跟C++标准不是蛮接近的吗?

其实也可以解释这种现像。

因为标准规定,字符常量语义上应该被认定为整形常量。所以
char *p = 'a';

char *p = 97;
在语义上是等价的。(但在语义分析之前的词法分析应该会给出变量类型不匹配的错误。)

这种赋值,逻辑虽然说得通。但是编译器肯定要警告。
不过 '\0' 就是常数 0,这个地址有特殊含义。是可以给任何指针变量赋值的。
2011-02-01 00:14
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:3 
回复 楼主 lz1091914999
这么做是完全合理的,不管在哪中c++编译器中都不会报错的。

p是指针可以接受地址的值,地址其实也是数字,但是一般是十六进制的。‘\0’的ASCII码是0,所以把‘\0’赋给p相当于把0赋给了p。
这样做事完全合理的。只是没有进行类型转换,编译会警告。

但是这么做是危险的。除非你很了解你要赋给p的内存里面的内容。当然这里0一般代表空地址。是不会出现什么问题。但是其他的数值就可能产生未知的结果了。


不知道说清楚了吗?

没清楚可以给我发信息。


[ 本帖最后由 南国利剑 于 2011-2-1 01:24 编辑 ]

南国利剑
2011-02-01 01:07
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
类型不匹配(除非有转换构造函数能转过去,不过这样就算匹配了)应该是错误,难道你的编译器只给警告吗?
2011-02-01 09:48
快速回复:'\0'可以赋值给char *?为什么?
数据加载中...
 
   



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

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