Путаница с указателем на функцию C - PullRequest
3 голосов
/ 16 февраля 2012

В чем разница между этими 2 декларациями:

int operate(int (*func)(int, int), int a, int b){
    return (*func)(a, b);
}

и

int operate(int func(int, int), int a, int b){
        return func(a, b);
 }

Эти два также, кажется, эквивалентны: operate(sum, 1, 1) и operate(&sum, 1, 1)

Если я передам функцию sum как функцию от 2 чисел вместо func, результат останется прежним. Почему?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

§6.7.5.3 / 8:

Объявление параметра как «функции, возвращающего тип» должно быть настроено на «указатель на функцию, возвращающую тип», как в 6.3.2.1.

Другими словами, два объявления функций идентичны.

Что касается вызова функции, §6.5.2.2 / 3:

Постфиксное выражение, за которым следуют скобки (), содержащие, возможно, пустой список выражений через запятую, является вызовом функции.Постфиксное выражение обозначает вызываемую функцию.

Так как func(a, b); и (*func)(a, b) являются постфиксными выражениями, за которыми следуют круглые скобки, они оба являются вызовами функций.Поскольку func и (*func) обозначают одну и ту же функцию, они оба вызывают одну и ту же функцию.

3 голосов
/ 16 февраля 2012

Два прототипа функции эквивалентны.Начиная с C99, 6.7.5.3:

Объявление параметра как «возвращающего функцию типа» должно быть настроено на «указатель на возвращаемый функцией тип», как в 6.3.2.1.

Два вызова функций (operate(sum, 1, 1) и operate(&sum, 1, 1)) эквивалентны;функция в большинстве случаев превращается в указатель на функцию (аналогично тому, как массив превращается в указатель на свой первый элемент).Начиная с C99, 6.3.2.1:

Обозначение функции - это выражение, имеющее тип функции.За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, указатель функции с типом '' тип, возвращающий функцию '' преобразуется в выражение, имеющее тип '' указатель на функцию, возвращающую тип ''.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...