Все printf()
используемые вами вызовы неверны, за исключением второго, поскольку неверен либо относительный аргумент, либо используемый спецификатор преобразования.
Это вызывает Неопределенное поведение :
Цитата из C18, 7.21.6.1/9 - «Функция fprintf»:
" Если спецификация преобразования недопустима, поведение не определено.288) Если есть Аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено."
printf("%c\n",p);
Когда вы пытаетесь напечатать значение объекта, на который указывает указатель , вы должны использовать оператор разыменования (*
), предшествующий объекту указателя. В противном случае вы пытаетесь напечатать значение указателя - адрес объекта, на который указывает указатель. И из-за этой операции вы используете неверный спецификатор преобразования %d
вместо %p
для печати значения указателя.
Исправленная программа:
#include<stdio.h>
int main(void)
{
char c[]= "Suck It Big";
char *p = c;
printf("%c\n", *p); // Prints the first element of array c.
printf("%c\n", p[3]); // Prints the fourth element of array c
printf("%c\n", *(++p)); // Prints the second element of array c
printf("%p\n", (void*) p); // Prints the address held in p / first element of c.
printf("%p\n", (void*) &p[3]); // Prints the address of the fourth element of c.
}
Обратите внимание, что приведение к void*
необходимо для того, чтобы программа соответствовала стандарту C.
Вывод:
S
k
u
0x7fff1d3a133d // Address defined by system
0x7fff1d3a1340 // Address defined by system