Простой способ выяснить, на какой тип указателя указывает, это просто удалить *
и посмотреть, что осталось:
char p[15];
char p(int *a);
int pt(char*);
int pt(char*);
То, что вы получите, - это объявление переменной типа, на который будет указывать ваш указатель. Или нет в четвертом случае:
int *pt(char*);
- это прототип функции, а не допустимое объявление указателя.
EDIT:
Причина в том, что без скобок вызов функции "operator" имеет приоритет над оператором разыменования указателя. В приведенном выше случае декларация на простом английском языке:
У нас есть функция pt(char *)
, которая возвращает int *
В то время как
int (*pt)(char *);
переводится как:
*pt
- это функция, которая принимает char *
и возвращает int
.
Что по сути означает, что pt
сам по себе является указателем на этот тип.