Почему последние два оператора print ничего не печатают после указателя типа «ptr»? - PullRequest
3 голосов
/ 20 мая 2019

Я хотел посмотреть, что произойдет после типизации целочисленного указателя ptr на символьный указатель ptr0.Но последние два оператора печати не выводят вывод на консоль.

#include <iostream>
using namespace std;

int main(void)
{
    int var  = 1025;
    int *ptr = &var;

    //~ addr of var
    cout << ptr << endl;

    //~ value of var - dereferencing 
    cout << *ptr << endl;

    char *ptr0;

    //~ typecasting int to char
    ptr0 = (char*)ptr; // also tried: ptr0 = (char*)&var

    cout << ptr0 << endl;
    cout << *ptr0 << endl;

    return 0;
}

вывод показывает:

0x7ffd6d8f4b94
1025

ожидаемый результат:

0x7ffd6d8f4b94
1025

0x7ffd6d8f4b94
1

1 Ответ

5 голосов
/ 20 мая 2019

Обе строки что-то печатают. Однако это «что-то» непечатно.

В C ++ char* считается строкой. Таким образом, в отличие от любого другого типа указателя, cout не сообщит вам адрес, который хранит char*, но интерпретирует память, на которую указывает, как массив с нулевым символом в конце char s. Опять же, это потому, что char* получает специальную обработку в C ++. В вашем случае память, в которой хранится ваша 1025 (или 0x00000401 в шестнадцатеричном), выглядит следующим образом:

01 04 00 00

Если вы позволите ptr0 указать на это, оно будет указывать на 01. Так как это char*, он будет интерпретирован как строка длины два: первый символ - 01, второй - 04, а затем есть 00, который определяет конец. Глядя на таблицу ASCII , мы видим, что эти символы относятся к некоторым непечатаемым символам (я представляю с нуля до малости, для чего они (были) хороши). Итак, cout не печатает ничего, кроме следующего endl.

cout << *ptr0 << endl;, с другой стороны, будет печатать только первый символ этой строки, который снова не может быть напечатан.

Если вы хотите напечатать адрес и номер вместо строки и символа, вам придется привести их обратно к некоторому другому указателю и некоторому целому числу соответственно, например, как это:

cout << (void*)ptr0 << endl;
cout << (int)*ptr0 << endl;

См. здесь , как печатается ваш ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...