C ++ указатель на символ - PullRequest
1 голос
/ 22 июня 2009
char *ps;
ps = &anotherChar;
cout << ps;

Почему при этом отображается значение anotherChar, а не только адрес?

Ответы [ 7 ]

13 голосов
/ 22 июня 2009

Для char * существует перегрузка operator<<, которая интерпретирует ее как строку для вывода. Если вы хотите адрес, вы можете привести к void*.

5 голосов
/ 22 июня 2009

Причина в том, что char* в C / C ++ является типом двойного назначения. Это может быть как указатель на один символ, так и строка в стиле C. Функция cout решает рассматривать это как строку стиля C и, следовательно, будет печатать значения вместо адреса.

Это также потенциальная проблема для вашего приложения. Строки стиля C заканчиваются нулевым значением терминатора. Следовательно, это может считывать недопустимую память, поскольку она не инициализирована должным образом.

3 голосов
/ 22 июня 2009

Оператор << предполагает, что вы хотите напечатать строку, а не адрес строки. <br> Поскольку ps указывает на строку, если вы хотите напечатать адрес ps, используйте «<< & ps» </p>

2 голосов
/ 22 июня 2009

Потому что char * - это строки в стиле c. Он делает то, что, как он думает, вы хотите, то есть печатает c-строку, на которую указывает ps.

Вы можете напечатать адрес с помощью:

cout << static_cast<void*>(ps) << endl;
1 голос
/ 22 июня 2009

Если вы хотите значение указателя:

cout << (void *) ps;
1 голос
/ 22 июня 2009

Оператор << имеет множество перегрузок для работы с потоками. </p>

Один из них выводит для вас строку с нулем в конце. Тип переменной, используемой для указания строки, заканчивающейся нулем, - это char *. Это то, что вы использовали. Если вы написали:

char* ps = "hello";
cout << ps;

Эта перегрузка выдаст «привет». Вероятно, просто повезло, что в нём есть еще один ноль в памяти после anotherChar, так что перегрузка << останавливает печать символов после печати anotherChar. Есть большая вероятность, что, если это не ноль, вы распечатаете случайные символы из памяти, пока не встретите ноль. </p>

0 голосов
/ 22 июня 2009

C ++ не имеет встроенного типа для строк. Он использует нулевое окончание (массив, заканчивающийся на '\ 0') char * (плюс или минус константные квалификаторы) или char [] как соглашение для представления строк. Все библиотеки Standard C используют это соглашение.

Итак, STL ostreams также использует это соглашение.

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