#c #указатели
Объясните, пожалуйста, есть ли разница между двумя записями, если есть, то какая? #includeint 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в Беркли. Стандарт, в целях совместимости, разрешил использовать оба подхода как эквивалентные.
Комментариев нет:
Отправить комментарий