This is the point from ISO :Standard Conversions:Array-to-pointer conversion: $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. ]
Can any one explain this, if possible with an example program.
I thing i know regarding string literals...may i know about above statement( wide string literal Prefix L usage).I know ..about the wide string literal meanig.But i need it according to the above satement I mean with Lvaue to Rvalue Conversions.
Before const
was introduced into C, many people wrote code like this:
char* p = "hello world";
Since writing to a string literal is undefined behavior , this dangerous conversion was deprecated. But since language changes shouldn't break existing code, this conversion wasn't deprecated immediately .
Using a pointer to a constant character is legal, since const correctness does not let you write through it:
const char* p = "hello world";
And that's all there really is too it. Ask specific questions if you need more information.
When you write
cout<<*str //output :s
it means that you obtain the str[0]
, as str is a char array and the pointer to array is the pointer to it's first element. str[0]
appears to be a char, so cout as a clever object prints you what you wanted - the first character of your char array.
Also,
cout << (str+1)
will print 't'
char* str = "stackoverflow";
cout << str; //output :stackoverflow
This is because the type of str
is 'pointer-to-char', so the output is the complete zero-terminated string that starts at str
.
cout << *str //output :s
Here, the type of *str
is just char -- using the leading *
dereferences the pointer and gived you back the 'thing-pointed-to', which is just the single char 's'.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.