指针和字符串文字

时间:2014-12-24 06:25:16

标签: c++ pointers string-literals

我多次看到以下陈述:

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);

为什么?

3 个答案:

答案 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指针本身。