这是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。
答案 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;。