Спецификатор формата %s
для printf
используется для печати строки и ожидает аргумент char *
, который указывает на первый элемент массива символов с нулевым символом в конце. Спецификатор формата %d
используется для печати целого числа в десятичном формате и предполагает int
.
Поскольку str
является массивом, при использовании в выражении он распадается в указатель на свой первый элемент. Таким образом, str
в выражении имеет тип char *
, который соответствует ожидаемому %s
.
*str
недопустимо для %s
, поскольку оно имеет тип char
и имеет значение первого символа в массиве. Использование неправильного спецификатора формата для данного аргумента для printf
вызывает неопределенное поведение .
*p
действителен для %d
, поскольку p
имеет тип int *
, что означает, что *p
имеет тип int
, что соответствует ожидаемому %d
.