Понимание указателей функций


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 4

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

Если у вас есть проблемы с пониманием таких определений, как и у всех смертных, используйте спиральное эмпирическое правило

Это функция, которая возвращает int*

int* f2(){}

Итак, вам нужно:

(int*) (*q)();
q = f2; 

p является указателем на функцию, принимающую аргумент void и возвращающую целое число.

f1 это функция, принимающая аргумент void и возвращающая целое число.

f2 это функция, принимающая аргумент void и возвращающая указатель на целое число.

Теперь в соответствии с определениями вы можете видеть, что f1 может быть присвоено p, но f2 может't.To назначить f2 в p, объявление p должно быть int *(*p)();

Вы сделали неправильные назначения, то есть несовместимые типы

Для функций

int f1(){}
int* f2(){}

Правильными назначениями были бы

int (*p)(); 
p = f1;

int* (*p)();
p = f2;