используя указатель с переменной char - PullRequest
2 голосов
/ 30 июля 2010

предположим

char a='s';

теперь я хочу сохранить адрес переменной a в указателе символа p

char *p=&a;

, если я использую cout << p;, тогда я получу значение s, а неадрес!

Может кто-нибудь объяснить причину, почему это так?

Ответы [ 5 ]

8 голосов
/ 30 июля 2010

Оператор basic_ostream << специализирован для const char* аргументов *, чтобы выводить его как строку C **.См. ответ на Почему cout печатает массивы символов иначе, чем другие массивы? для получения более подробной информации.

В принципе, вы можете привести p к void*, когдапечать для получения адреса.

cout << static_cast<void*>(p);

*: также const charT*, где charT - тип символов, принятый basic_ostream, const unsigned char* и const signed char*если charT == char.Например, wcout будет обрабатывать const wchar_t* как (широкую) строку C, но cout будет обрабатывать ее как указатель.

**: это может быть переопределеночерты характера, используемые этим basic_ostream.См. Подробный алгоритм в стандарте C ++ § [ostream.inserters.character] / 4.

1 голос
/ 30 июля 2010

Вызов cout << p является типобезопасным (объекты и операторы C ++), поэтому он использует оператор для char *.Этот оператор служит для печати строк, сохраненных в указателе символа.Он берет адрес и печатает все от начала до первого появления нулевого байта.Если вы используете MS Windows, то, вероятно, это только один символ, потому что эта система обнуляет память, поэтому скоро будет нулевой байт.Если вы хотите распечатать адрес, попробуйте cout << (void *)p;

0 голосов
/ 30 июля 2010

Как сказано в ответах выше, оператор << перегружен для обработки char * в виде строки типа C, т. Е. Массива символов с нулевым символом в конце.В вашем случае, когда вы печатаете p, он обрабатывается как строка C и печатаются все символы до первого символа NULL.Если вы печатаете только <strong>s , то рядом с вашей переменной a в памяти находится символ NULL.Но это поведение может меняться в зависимости от содержимого памяти.Я предполагаю, что вы объявляете a как глобальную переменную, потому что пространство для глобальных переменных обычно инициализируется для всех нулей.

Также будет интересным экспериментом для вас объявить две символьные переменные и затем указать указатель таким же образомкак у вас выше.Я предполагаю, что указатель на первую переменную выведет их обоих.

0 голосов
/ 30 июля 2010

В C * char* обычно используется для указания на начало строки с нулевым символом в конце. Чтобы сделать потоки ввода-вывода C ++ (например, cout) совместимыми с этой привычкой, существует перегруженная версия operator<<() для обработки указателей char. Этот оператор просто выводит строку с нулевым символом в конце, начиная с указанного адреса.

Если вы хотите распечатать «значение» указателя (обратите внимание, что он не является частью стандарта C / C ++, как «выглядит» указатель), приведите указатель к void*, например

std::cout << static_cast<void*>(charpointer);
0 голосов
/ 30 июля 2010

В C / C ++ указатель на символ обычно используется как указатель на строку с нулевым символом в конце.Оператор << обрабатывает этот общий случай использования.</p>

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