Понимание указателей функций
int f1(){}
int* f2(){}
int main()
{
int *a;//1
int b;
int *c;
a=c;
a=&b;
int (*p)(); //2
p=f2; //showing error
p=&f1;
}
Я ожидал, что в моей программе '2' будет вести себя так же, как '1'. Почему указатель функции ведет себя по-разному. Или я что-то упустил?5 ответов:
p=f2;ошибка из-за несовместимых типов.f2- функция, которая может возвращатьint*, тогда какp- указатель на функцию, которая может указывать на функцию, возвращающуюint, напримерf1()Для
int* f2()можно задать указатель на функцию следующим образом:int* (*p2)(); // pointers to function f2 p2 = f2;Кроме того, вам не нужно использовать
&перед именем функции достаточно просто имени функции. Вот хорошая ссылка для чтения: почему все эти сумасшедшие определения указателей функций работают? Что происходит на самом деле дальше?Edit:
Некоторое время&functionnameиfunctionnameне совпадают, напримерsizeof(functionname)не является действительным , тогда какsizeof(&functionname)является совершенно действительным.
int* f2(){}Функция, которая ничего не принимает и возвращаетуказатель на int .
int (*p)();Указатель на: функцию, которая ничего не принимает и возвращает int
У вас есть несоответствие типов.
pне является указателем на Типf2Если у вас есть проблемы с пониманием таких определений, как и у всех смертных, используйте спиральное эмпирическое правило
pявляется указателем на функцию, принимающую аргумент void и возвращающую целое число.
f1это функция, принимающая аргумент void и возвращающая целое число.
f2это функция, принимающая аргумент void и возвращающая указатель на целое число.Теперь в соответствии с определениями вы можете видеть, что
f1может быть присвоеноp, ноf2может't.To назначитьf2вp, объявлениеpдолжно бытьint *(*p)();