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



我正在开发一个使用指针的字符串类,我只是在理解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;
}

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

我认为可以肯定地说,这样做是为了方便——让打印字符串变得容易。

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

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

尝试:

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

这是因为"<<"将自动跟随指针并打印出字符串,而不仅仅是打印出内存地址。这在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打印出内存地址。

最新更新