为什么我的指针输出一个字符串而不是内存地址? C ++

时间:2011-10-17 01:38:01

标签: c++ pointers dynamic-arrays

我正在使用一个使用指针的字符串类,我在理解我的print函数如何在这里工作时遇到了一些困难。具体来说,为什么cout << pString输出字符串而不是它指向的动态数组的内存地址?我的理解是变量pString是一个指针。

class MyString
{
    public:
        MyString(const char *inString);
        void print();
    private:
        char *pString;
};


MyString::MyString(const char *inString)
{
    pString = new char[strlen(inString) + 1];
    strcpy(pString, inString);
}

void MyString::print()
{
    cout << pString;
}

int main( )
{
    MyString stringy = MyString("hello");
    stringy.print();
    return 0;
}

3 个答案:

答案 0 :(得分:9)

这是因为<<运算符已经过载以处理char*的情况并将其作为字符串打印出来。与地址相反(与其他指针一样)。

我认为这样做是为了方便 - 这样可以轻松打印字符串。

编辑:

因此,如果您想打印地址,则应将指针强制转换为void*

答案 1 :(得分:5)

变量pString 指针。但是,与输出流一起使用时<<的实现知道如果您尝试输出char *,则应将输出打印为以null结尾的字符串。

尝试:

cout << static_cast<void *>(pString);

答案 2 :(得分:1)

这取决于“&lt;&lt;”将自动跟随指针并打印出字符串,而不是只打印出内存地址。这在printf中更容易看到,因为您可以指定打印指针或指针引用的内容。

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char** argv)
{
    char string1[] = "lololololol";
    char* string2;

    string2 = string1;

    printf("%s",string2);
    printf("%p",string2);

    return EXIT_SUCCESS;
}

你可以在这里看到%s打印出字符串,%p打印出内存地址。