免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: soyh8086
打印 上一主题 下一主题

"hello" 的类型是 const char *? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-30 21:38 |只看该作者

回复 10楼 soul_of_moon 的帖子

同意

论坛徽章:
0
12 [报告]
发表于 2006-05-01 14:40 |只看该作者
按照 C/C++ 标准的描述,"hello" 是 string literal (字符字面量、字符文字量),具有静态存储性质,类型是数组类型,并且不能被改变。注意:"hello" 是一个数组类型的对象,是左值。当然左值可以转化为右值使用,就像数组类型的对象可以转化为指针一样。

虽然 "hello" 是数组类型,但是 C 和 C++ 在类型规定上是有区别的:在 C 中,"hello" 的类型是 char [6];在  C++ 中,其类型是 const char [6]。

由于数组类型可以转换为指针类型来使用,所以在 C 和 C++ 中 "hello" 可分别作为 char* 及 const char* 使用。

另外,出于对 C 的兼容性的考虑,C++ 标准还做了一条特殊的规定,即允许 "hello" 自动转换为 char*。但是这条规则被 C++ 标明为 “Deprecated”,不被推荐使用。

综上所述,"hello" 字符字面量可以作为以下类型来使用:

在 C 中:char [6]、char*
在 C++ 中:const char [6]、 const char*、char*

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
13 [报告]
发表于 2006-05-01 21:26 |只看该作者
注意:"hello" 是一个数组类型的对象,是左值

怀疑ing,找资料ing

论坛徽章:
0
14 [报告]
发表于 2006-05-01 23:57 |只看该作者
原帖由 aero 于 2006-4-30 19:01 发表
对于楼主的说法是肯定的,
对于3楼的说法是错误的,
对于7楼的说法是要求证的,^_^,我也不清楚,不过的确有编译器可以这样,也许VC也有这样的选项。


我看过小品文《C++的对话》第一篇是三楼的说法就是char *p="hello";
p是const char *;我以前在看那个小品文时在IBM上验证过:
char *p="hello";
如果这时赋值: *p='a';
IBM上会core,所以我也认为3楼的说法是正确的。

论坛徽章:
0
15 [报告]
发表于 2006-05-02 10:28 |只看该作者
原帖由 soul_of_moon 于 2006-4-30 20:46 发表
char *p = "Hello";
p是 char *,只是它指向的是“Hello”(常量,只是右值,所以不能变)。
但是p不是char *const,所以一旦p指向的地址发生改变,不指向常量了,如:char a[10],p=a,p指向的地址的内 ...


同意!

论坛徽章:
0
16 [报告]
发表于 2006-05-02 10:59 |只看该作者
原帖由 hkwang66 于 2006-5-1 23:57 发表


我看过小品文《C++的对话》第一篇是三楼的说法就是char *p="hello";
p是const char *;我以前在看那个小品文时在IBM上验证过:
char *p="hello";
如果这时赋值: *p='a';
IBM上会core ...


兄弟,看清楚了,3楼说的p是const,不是*p。所以3楼的说法是错误的。

"hello"是一个左值,是一个常量字符串,其内容是不能被修改的。

但p仅仅是一个指针而已,在此,它可以指向任何咚咚,只要在其值类型允许的范围,呵呵。

论坛徽章:
0
17 [报告]
发表于 2006-05-02 17:16 |只看该作者
我又犯了没有仔细审题的老毛病;的确p只是一个指向常量的指针。

[ 本帖最后由 hkwang66 于 2006-5-2 17:18 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2006-05-02 19:37 |只看该作者
正解



原帖由 soul_of_moon 于 2006-4-30 20:46 发表
char *p = "Hello";
p是 char *,只是它指向的是“Hello”(常量,只是右值,所以不能变)。
但是p不是char *const,所以一旦p指向的地址发生改变,不指向常量了,如:char a[10],p=a,p指向的地址的内 ...

论坛徽章:
0
19 [报告]
发表于 2006-05-02 21:06 |只看该作者
在编译器默认优化项下可以理解为:

     char *const p = "hello";
      
p的值可以指向其他的地址,但是在改变指向之前,*p...*(p+5)的值不能改变。

论坛徽章:
0
20 [报告]
发表于 2006-05-03 13:33 |只看该作者
原帖由 ModemLin 于 2006-5-2 21:06 发表
在编译器默认优化项下可以理解为:

     char *const p = "hello";
      
p的值可以指向其他的地址,但是在改变指向之前,*p...*(p+5)的值不能改变。



p为常指针,不能改变指向
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP