2015-03-21 3 views
3
char p; 
cout << &p; 

Это не печатает адрес символа p. Он печатает некоторые символы. Зачем?«cout» и «char address»

char p; 
char *q; 
q = &p; 
cout << q; 

Даже это не так. Зачем?

+1

'& p' приравнивает к' полукокса * ', а' '<< оператор имеет специальную перегрузку для обработки 'char *' как C-string с нулевым завершением. –

+0

printf намного более элегантный здесь. 'printf ("% p \ n ", (void *) pointer);' –

ответ

5

Я считаю, что оператор << признает его как строку. Кастинг его к void*должны работы:

cout << (void*)&p; 

std::basic_ostream имеет специализированный оператор, который принимает std::basic_streambuf (который в основном является строка (в данном случае)):

_Myt& operator<<(_Mysb *_Strbuf) 

в противоположность оператору, который принимает любой указатель (кроме char*, разумеется):

_Myt& operator<<(const void *_Val) 
2

std::cout будет рассматривать char* как строку. Вы в основном видите все, что содержится в памяти, в месте расположения вашего неинициализированного указателя - до тех пор, пока не встретится конечный нулевой символ. Кастинг указателя на ничтожном * должно напечатать фактическое значение указателя, если вам нужно, чтобы увидеть его

3

Это происходит потому, что указатель на char имеет свою собственную перегрузку <<, которая интерпретирует указателя в виде строки C.

Вы можете исправить свой код, добавив оттенок void*, который является перегрузка, которая печатает указатель:

char p; 
cout << (void*)&p << endl; 

Demo 1.

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

int p; 
cout << &p << endl; 

Demo 2.

Смежные вопросы