разница между printf () и std :: cout по отношению к указателям - PullRequest
1 голос
/ 02 декабря 2019

Я новичок в указателях и не могу понять одну простую вещь.

   int main ()
{
    char *str1="pointer";
    printf("%p \n", str1);
    cout << str1<<endl;
    return 0;
}

Вывод выглядит следующим образом:

0000000000409001
pointer

Может кто-нибудь объяснить мне здесь разницу. почему не печатается адрес памяти? как я могу сделать cout print адрес str1?

Ответы [ 3 ]

4 голосов
/ 02 декабря 2019

Спецификатор формата %p печатает void *, (не соответствует действительности, поэтому char * неявно преобразуется в void *), char * преобразуется в void * перед печатью. (Но это на самом деле неопределенное поведение, см. Комментарии. Правильный способ сделать это будет printf("%p", (void *) str1);). Соответствующий код C ++ будет std::cout << (void *) str1 << '\n';.

Код std::cout << str1; печатает str1 как нользавершенная строка. Соответствующий C-код будет printf('%s', str1);

3 голосов
/ 02 декабря 2019

Указатель - это адрес в памяти.

"pointer" - это C-строка в памяти, 8 байтов для букв и завершающий NULL-байт. str1 - указатель на байт первой буквы 'p'.


printf("%p", str1) печатает значение самого указателя, то есть адрес памяти (в данном случае 0000000000409001).

printf("%s", str1) будет печатать pointer, содержимое C-строки в расположении str1.


cout << str1 << endl также печатает содержимое C-строки,Это поведение по умолчанию для указателя типа char*, поскольку они обычно являются строками.

cout << static_cast<void*>(str1) << endl будет снова печатать адрес указателя.

1 голос
/ 02 декабря 2019

символ * - это указатель на начало массива символов.

cout "распознает" символ * и обрабатывает его как строку.

Выявно указывает printf () распечатать десятичное представление адреса указателя с помощью средства форматирования% p.

Вы явно указываете printf () распечатать представление изадрес указателя с форматером% p.

EDIT: отредактировано для точности на основе комментария

...