指针和字符串文字

pul*_*ion 3 c++ pointers string-literals

很多次我看到以下陈述:

char* ch = "Hello"
cout<<ch;
Run Code Online (Sandbox Code Playgroud)

我得到的输出是" 你好 ".我知道ch指向字符串"Hello"的第一个字符,而"Hello"是字符串文字并存储在只读存储器中.因为,ch将第一个字符的地址存储在字符串文字中,所以不应该是语句,

cout<<ch;
Run Code Online (Sandbox Code Playgroud)

给输出" 一个字符的地址 "因为,它是一个指针变量?相反,它打印字符串文字本身.而且,如果我写这个,

ch++;
cout<<ch;
Run Code Online (Sandbox Code Playgroud)

它给出了输出" ello ".同样地,它也发生在更多连续的ch ++语句中.

任何人都可以告诉我,为什么会这样?
顺便说一句,我已经看到了与字符串文字有关的其他问题,但是所有这些问题都解决了"为什么我们不能做类似*ch ='a'的问题?
编辑:我也想问这个参考C,它如果我输入,也会发生在C中,

printf("%s",ch);
Run Code Online (Sandbox Code Playgroud)

为什么?

rav*_*avi 7

有重载版本 operator<<

ostream& operator<< (ostream& , const char* );
Run Code Online (Sandbox Code Playgroud)

只要您使用以下内容,就会调用此重载: -

char *p = "Hello";
cout << p;
Run Code Online (Sandbox Code Playgroud)

此重载定义了如何打印该字符串而不是打印地址.但是,如果要打印地址,可以使用,

cout << (void*) p;
Run Code Online (Sandbox Code Playgroud)

因为这将调用另一个重载,只是打印地址流: -

ostream& operator<< (ostream& , void* );
Run Code Online (Sandbox Code Playgroud)