Почему мой указатель выводит строку, а не адрес памяти в C ++? - PullRequest
4 голосов
/ 17 октября 2011

Я работаю над строковым классом, в котором используются указатели, и мне просто трудно понять, как работает моя 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 ]

9 голосов
/ 17 октября 2011

Это потому, что оператор << был перегружен, чтобы обработать регистр char* и вывести его в виде строки.В отличие от адреса (который имеет место с другими указателями).

Я думаю, можно с уверенностью сказать, что это сделано для удобства - чтобы было легко распечатать строки.

РЕДАКТИРОВАТЬ:

Поэтому, если вы хотите распечатать адрес, вы должны привести указатель к void*.

5 голосов
/ 17 октября 2011

Переменная pString является указателем. Однако реализация << при использовании с выходным потоком знает, что если вы попытаетесь вывести char *, то вывод должен быть напечатан как строка с нулевым символом в конце.

Попробуйте:

cout << static_cast<void *>(pString);
1 голос
/ 17 октября 2011

Это связано с тем фактом, что «<<» будет автоматически следовать за указателем и распечатывать строку, а не просто распечатывать адрес памяти.Это легче увидеть в printf, так как вы можете указать распечатку указателя ИЛИ то, на что ссылается указатель. </p>

#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 выводит памятьадрес.

...