注册 登录
编程论坛 C++教室

'\0'可以赋值给char *?为什么?

lz1091914999 发布于 2011-01-31 14:52, 2427 次点击
如题所问.
8 回复
#2
pangding2011-01-31 15:44
感觉不行吧,一个是 char 一个是 char * 类型应该不匹配呀。
#3
lz10919149992011-01-31 16:06
回复 2楼 pangding
是啊,用'\0'赋值给char * 编译和运行都可以,但用'a'或'\n'赋值给char * 编译就报错,我用的编译器是VS2010,跟C++标准不是蛮接近的吗?
#4
zqmillet2011-01-31 20:21
只有本站会员才能查看附件,请 登录

VC6倒是可以

只是VC不是最标准的C++
#5
zqmillet2011-01-31 20:27
VC2010也可以啊……
只有本站会员才能查看附件,请 登录
#6
pangding2011-02-01 00:05
你们写的并不是赋值给 char *。
你们那种写法应该是没问题的。

楼主说的应该是类似这样的:

char *p;
p = '\0';

当然这种做法本身很愚蠢,不过探究一下語法上通不通倒可以。应该是不符合語法,我觉得。
#7
pangding2011-02-01 00:14
以下是引用lz1091914999在2011-1-31 16:06:43的发言:

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

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

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

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

这种赋值,逻辑虽然说得通。但是编译器肯定要警告。
不过 '\0' 就是常数 0,这个地址有特殊含义。是可以给任何指针变量赋值的。
#8
南国利剑2011-02-01 01:07
回复 楼主 lz1091914999
这么做是完全合理的,不管在哪中c++编译器中都不会报错的。

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

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


不知道说清楚了吗?

没清楚可以给我发信息。


[ 本帖最后由 南国利剑 于 2011-2-1 01:24 编辑 ]
#9
pangding2011-02-01 09:48
类型不匹配(除非有转换构造函数能转过去,不过这样就算匹配了)应该是错误,难道你的编译器只给警告吗?
1