标准转换:数组到指针转换(字符串)

时间:2010-11-19 11:53:24

标签: c++

这是ISO的标准:标准转换:数组到指针的转换:$ 4.2.2

   A string literal (2.13.4) that is not a wide string literal can be converted 
    to an rvalue of type “pointer to char”; a wide string literal can be 
    converted to an rvalue of type “pointer to wchar_t”. In either case,
    the result is a pointer to the first element of the array. This conversion 
    is considered only when there is an explicit appropriate pointer target 
    type , and not when there is a general need to convert from an lvalue to
    an rvalue. [Note: this conversion is deprecated. ] 

   For the purpose of ranking in overload resolution (13.3.3.1.1), this 
   conversion is considered an array-to-pointer conversion followed by a
   qualification conversion (4.4). 

  [Example:"abc" is converted to "pointer to const char” as an array-to-pointer  
  conversion, and then to  “pointer to char” as a qualification conversion. ]

任何人都可以解释这一点,如果可能,请使用示例程序。

我知道关于字符串文字...我可能知道上面的语句(宽字符串文字前缀L用法)。我知道..关于宽字符串字面意思。但我需要它根据上面的陈述,我的意思是Lvaue对Rvalue Conversions。

3 个答案:

答案 0 :(得分:1)

在将const引入C之前,许多人编写了这样的代码:

char* p = "hello world";

由于写入字符串文字为undefined behavior,因此不推荐使用此危险转换。但由于语言更改不应破坏现有代码,因此不立即弃用此转换

使用指向常量字符的指针是合法的,因为const正确性不允许您通过它来写:

const char* p = "hello world";

这就是真的。如果您需要更多信息,请询问具体问题。

答案 1 :(得分:0)

写作时

cout<<*str    //output :s

这意味着你获得了str[0],因为str是一个char数组,而指向array的指针是指向它的第一个元素的指针。 str[0]似乎是一个char,所以cout作为一个聪明的对象打印出你想要的东西 - 你的char数组的第一个字符。

另外,

cout << (str+1)

将打印't'

答案 2 :(得分:0)

   char* str = "stackoverflow";
   cout << str;  //output :stackoverflow

这是因为str的类型是指向char的指针,因此输出是从str开始的完整的以零结尾的字符串。

  cout << *str    //output :s

在这里,*str的类型只是字符 - 使用前导*取消引用指针并将你的东西指向&#39;,这只是单个字母&#39;。