字符指针的初始化

142 篇文章 0 订阅

字符指针的初始化(2006-8-4 16:04:00)

【收藏】 【评论】 【打印】 【关闭】

初学者经常被这个问题所困惑:
char *p="abc"==>"abc"是一个const char*,为什么能够赋值给char *?
 
很多论坛上都可以看到这样的提问帖,不过这些帖子有的讲的是错误的,有的虽然是对的,但是讲的不细致,初学者不好理解。对此,我根据我的经验,以及CSDN上的一些帖子仔细地说一下其中的道理。
 
按照 C/C++ 标准的描述,"abc" 是 string literal (字符字面量、字符文字量),具有静态存储性质,类型是数组类型,并且不能被改变。注意:"abc" 是一个数组类型的对象,是左值。当然左值可以转化为右值使用,就像数组类型的对象可以转化为指针一样。
虽然 "abc" 是数组类型,但是 C 和 C++ 在类型规定上是有区别的:在 C 中,"abc" 的类型是 char [4];在  C++ 中,其类型是 const char [4]。
由于数组类型可以转换为指针类型来使用,所以在 C 和 C++ 中 "abc" 可分别作为 char* 及 const char* 使用。
为了兼容c中char *p="abc"这种现象的存在,C++特别允许初始化时const char*到char*的自动转换。但是这条规则被 C++ 标明为 “Deprecated”,不被推荐使用。
综上所述,
在 C 中:char *p="abc"是完全合乎规则的事情
在 C++ 中:由于有特殊规定,所以这样也可以。
但在c++中要注意:
char *p="abc" 能不能编译通过要看你使用的编译器。鉴于大量遗留代码的存在,大部分编译器允许其通过,或者给个警告。当然,程序员自己必须保证绝不去修改其值:
a. 程序员不应该在代码中出现*p='A'这样的语句。这是当初约定好了的:编译器允许char *p="abc"通过,而程序员保证不去修改它。 
b. *p='A'编译时应该允许通过,因为单就这条语句而言,它完全合法。 
c. 运行时*p='A'能不能通过要看实际的运行环境,包括你使用的操作系统、编译器、编译器选项 等等,一句话,其运行结果由不得你,且不应该由你去关心,因为这种行为本身已经违反约定了。
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值