char p;
cout << &p;
Это не печатает адрес символа p. Он печатает некоторые символы. Зачем?«cout» и «char address»
char p;
char *q;
q = &p;
cout << q;
Даже это не так. Зачем?
char p;
cout << &p;
Это не печатает адрес символа p. Он печатает некоторые символы. Зачем?«cout» и «char address»
char p;
char *q;
q = &p;
cout << q;
Даже это не так. Зачем?
Я считаю, что оператор <<
признает его как строку. Кастинг его к void*
должны работы:
cout << (void*)&p;
std::basic_ostream
имеет специализированный оператор, который принимает std::basic_streambuf
(который в основном является строка (в данном случае)):
_Myt& operator<<(_Mysb *_Strbuf)
в противоположность оператору, который принимает любой указатель (кроме char*
, разумеется):
_Myt& operator<<(const void *_Val)
std::cout
будет рассматривать char*
как строку. Вы в основном видите все, что содержится в памяти, в месте расположения вашего неинициализированного указателя - до тех пор, пока не встретится конечный нулевой символ. Кастинг указателя на ничтожном * должно напечатать фактическое значение указателя, если вам нужно, чтобы увидеть его
Это происходит потому, что указатель на char
имеет свою собственную перегрузку <<
, которая интерпретирует указателя в виде строки C.
Вы можете исправить свой код, добавив оттенок void*
, который является перегрузка, которая печатает указатель:
char p;
cout << (void*)&p << endl;
Обратите внимание, что проблема происходит для char
указателя, но не для других виды указателей. Скажем, если вы используете int
вместо char
в вашей декларации, ваш код будет работать без броска:
int p;
cout << &p << endl;
'& p' приравнивает к' полукокса * ', а' '<< оператор имеет специальную перегрузку для обработки 'char *' как C-string с нулевым завершением. –
printf намного более элегантный здесь. 'printf ("% p \ n ", (void *) pointer);' –