字符指针的初始化

Posted on 2012-03-13 13:42  无忧consume  阅读(311)  评论(0编辑  收藏  举报
初学者经常被这个问题所困惑:
  char *p="abc"==>"abc"是一个const char*,为什么能够赋值给char *?
 
  按照 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'能不能通过要看实际的运行环境,包括你使用的操作系统、编译器、编译器选项 等等,一句话,其运行结果由不得你,且不应该由你去关心,因为这种行为本身已经违反约定了。

Copyright © 2024 无忧consume
Powered by .NET 8.0 on Kubernetes