Почему потоковый указатель на символ cout не печатает адрес?
============================================================

Когда я печатаю указатель на символ с`printf()`, он принимает решение с помощью спецификатора преобразования, должен ли адрес печататься или вся строка в соответствии с% u или% s.

Но когда я хочу сделать то же самое с`cout`, как будет`cout` решить, что должно быть напечатано среди адреса и всей строки? Вот пример источника:

Здесь, в моем компиляторе GNU,`cout` пытается вывести ch в виде строки.

Как я могу получить адрес`ch` с помощью`cptr` с помощью`cout`?

`ostream& operator<<(ostream& o, const char *c);` который используется для печати строк в стиле C Вы хотите другой`ostream& operator<<(ostream& o, const void *p);` быть выбранным. Вы, вероятно, лучше всего с актерами здесь:



Я бы просто бросил его в void *, чтобы он не пытался интерпретировать его как C-строку:

Однако более безопасным вариантом будет использование static\_cast, как в ответе dirkgently (таким образом, приведение по крайней мере проверяется во время компиляции).



 cout знает, что печатать, основываясь на типе. Если вы хотите напечатать значение указателя, вы должны привести указатель к void *, который будет интерпретирован как указатель.



`cout` печатает строку, если она получает`char *`, просто как тот.

Вот перегрузки для`operator <<` за`ostream`:

Если вы хотите адрес, вы хотите:

так что вам нужно привести к`const void*`.