Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Указатели на функции

#c #указатели


Объясните, пожалуйста, есть ли разница между двумя записями, если есть, то какая? 

#include 

int sum(int a, int b){
    return a+b;
}

main(){

    int (*fun)(int , int) = NULL;
    fun = sum;

    printf("%d\n\n", fun(12,14));
    printf("%d\n\n",(*fun)(12,14));


   return 0;
}

    


Ответы

Ответ 1



Разница существует лишь на абстрактном концептуальном уровне. Фактической разницы нет. Получение адреса функции тоже можно записать как fun = sum; или как fun = ∑. Разницы тоже нет. Можно, разве что, посоветовать быть единообразным, т.е. либо использовать явные операторы и там, и там fun = ∑ (*fun)(12,14); либо не использовать их ни там, ни там fun = sum; fun(12,14); Хотя и этот совет, возможно, не заслуживает большого внимания.

Ответ 2



Разницы по сути нет никакой, но этот вопрос заслуживает отдельного внимания из-за своей истории. В первом случае (*fun)(), так как fun указывает на ф-цию sum, то *fun - это ни что иное как sum. Во втором случае, когда fun () - это можно объяснить тем, что функция и указатель на нее - взаимозаменяемы! Но вот почему так? Почему не использовать один из подходов? Дело в том, что язык Си бурно развивался еще до того, как был опубликован первый стандарт и к этому времени уже были использованы оба варианта разными командами разработчиков. В частности первый подход выбрали разработчики, которые расширяли Unix в Bell Labs, а второй - которые расширяли Unixв Беркли. Стандарт, в целях совместимости, разрешил использовать оба подхода как эквивалентные.

Комментариев нет:

Отправить комментарий