Спецификатор преобразования %s
используется для вывода строк (последовательность символов, оканчивающихся нулевым символом '\0'
), указатели на первые символы которых передаются функции printf в качестве аргумента.
Вы можете себе представить, что функция внутренне выполняет следующий цикл
for ( ; *message != '\0'; ++message )
{
printf( "%c", *message );
}
Если вы предоставите выражение *message
, тогда оно будет иметь тип char
, и функция printf попытается интерпретировать его значение, которое является символом 'H'
, как значение указателя. В результате вызов функции будет иметь неопределенное поведение.
Чтобы вывести значение указателя message
, вы должны использовать спецификатор преобразования %p
, как
printf( "%p", message );
Или в виде целочисленного значения, например,
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
char *message = "Hello C Programmer!";
printf( "The value of the pointer message is %" PRIiPTR "\n", ( intptr_t )message );
return 0;
}