функция как параметр против указателя функции как параметр - PullRequest
6 голосов
/ 04 февраля 2012

Прослушивая курс Стэнфордского программирования , я наткнулся на фрагмент кода, похожий на следующий.

void plot(double start, double end, double (fn)(double)) {
    double i;
    for (i = start; i <= end; i += 1)
        printf("fn(%f) = %f\n", i, fn(i));
}

double plus1(double x) {
    return x + 1;
}

int main(void) {
    plot(1, 10, plus1);
    return 0;
}

Я скомпилировал код в моей системе, используя GCC, затем G ++; они оба бегают отлично.

Я знаю, что передача int i = 2 в функцию, такую ​​как void func1(int a), создаст новую копию этого i для этой функции, в то время как передача &i в void func2(int *a) даст только функции func2 адрес i.

Так может ли кто-нибудь объяснить мне, каков механизм передачи fn в plot и чем он отличается от передачи указателя функции в качестве параметра?

Ответы [ 2 ]

7 голосов
/ 04 февраля 2012

Нет абсолютно никакой разницы между void foo(double fn(double)) и void foo(double (*fn)(double)).Оба объявляют функции, которые принимают указатель на функцию в качестве параметра.

Это похоже на то, что между void bar(double arr[10]) и void bar(double* arr).

нет никакой разницы.
0 голосов
/ 04 февраля 2012

извините за мою ошибку.

void foo(int (fn)(int)){}
void bar(int (*fn)(int)){}

скомпилируйте приведенный выше код так:

gcc -S sample.c

вы обнаружите, что нет никакой разницы. просто другой стиль кодирования.

вы также можете попробовать скомпилировать и запустить этот код:

#include <stdio.h>
void foo(int (fn)(int))
{
    printf("foo: %x.\n",fn);
}
void bar(int (*fn)(int))
{
    printf("bar: %x.\n",fn);
}
int main(int argc)
{
    foo(main);
    bar(main);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...