我多次看到以下陈述:
char* ch = "Hello"
cout<<ch;
我得到的输出是&#34; Hello &#34;。我知道ch指向字符串的第一个字符&#34; Hello&#34;那个&#34;你好&#34;是一个字符串文字并存储在只读存储器中。因为,ch将第一个字符的地址存储在字符串文字中,所以不应该是语句,
cout<<ch;
输出&#34; 字符的地址&#34;因为,它是指针变量?相反,它打印字符串文字本身。 而且,如果我写这个,
ch++;
cout<<ch;
它提供输出,&#34; ello &#34;。同样地,它也会发生更多连续的ch ++语句。
任何人都可以告诉我,为什么会这样?
顺便说一句,我已经看到了与字符串文字有关的其他问题,但所有问题都解决了&#34;为什么我们不能做* ch =&#39; a&#39;?
编辑:我也想在参考C时问这个问题,如果我输入的话,它也会在C中发生,
printf("%s",ch);
为什么?
答案 0 :(得分:7)
有operator<<
ostream& operator<< (ostream& , const char* );
只要您使用以下内容,就会调用此重载: -
char *p = "Hello";
cout << p;
此重载定义了如何打印该字符串而不是打印地址。但是,如果要打印地址,可以使用
cout << (void*) p;
因为这会调用另一个重载,只是打印地址流: -
ostream& operator<< (ostream& , void* );
答案 1 :(得分:3)
在C ++中打印char *会为你提供字符串而不是指针,因为这是语言的定义方式,反过来因为它是有意义的,也是有用的。毕竟,我们很少需要打印字符串的地址。在实现方面,可以通过重载运算符来实现:
std::ostream& operator <<(std::ostream&, const char*);
您可以在标准库实现中找到类似的东西,但它实际上是一个模板:
template <typename CharT>
std::basic_ostream<CharT>& operator <<(std::basic_ostream<CharT>&, const CharT*);
它可能会有更多的模板参数。
至于为什么ch++
给你一个从第二个字符开始的字符串,那就是因为递增一个指针使它前进到&#34;数组中的下一个元素&#34;它指向。
答案 2 :(得分:0)
要回答关于printf()
中c
的 已编辑的 问题,请通过格式说明符确定与printf()
一起提供。请检查以下代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * p = "Merry Christmas";
printf("[This prints the string] >> %s\n", p);
printf("[This prints the pointer] >> %p\n", p);
return 0;
}
输出:
[sourav@broadsword temp]$ ./a.out
[This prints the string] >> Merry Christmas
[This prints the pointer] >> 0x80484a0
[sourav@broadsword temp]$
对于相同的变量p
,%s
用于打印字符串,而%p
用于打印p
指针本身。