Обе строки что-то печатают. Однако это «что-то» непечатно.
В 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;
См. здесь , как печатается ваш ожидаемый результат.