Понимание указателей функций
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)();