Запутался в указателях и их адресах - PullRequest
1 голос
/ 19 октября 2019

Я создал некоторый указатель в коде, но результаты не те, которые я ожидал.

Вот простой код:

int main(int argc, char const* argv[])
{
    int myInt = 23;
    int* ptr = &myInt;

    char* buffer = new char[8];
    memset(buffer, 0, 8);

    char** ptr2 = &buffer;

    std::cout << "ptr address is " << ptr << std::endl;
    std::cout << "buffer pointer is pointing to address " << buffer << std::endl;
    std::cout << "ptr2 pointer is pointing to address " << ptr2 << std::endl;
    std::cout << "Dereferencing ptr2 = " << *ptr2 << std::endl;
    return 0;
} 

А вот результаты выполнения кода:

адрес ptr равен 0x7ffde215a14c

указатель буфера указывает на адрес

указатель ptr2 указывает на адрес 0x7ffde215a150

Разыменование ptr2 =

Мне интересно, почему адрес указателя буфера не отображается и почему разыменование ptr2 также ничего не показывает, и все же указатель (ptr2), указывающий на указатель буфера, показывает этот адрес. Ничто из этого не имеет никакого смысла для меня.

1 Ответ

7 голосов
/ 19 октября 2019

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

std::cout << "buffer pointer is pointing to address " << reinterpret_cast<void*>(buffer) << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...