2012-02-04 106 views
6

當通過斯坦福大學的Programming Abstractions課程收聽時,我遇到了一段如下所示的代碼。功能作爲參數與功能指針作爲參數

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的新副本該功能,同時通過&ivoid func2(int *a)只會給功能func2i地址。

那麼任何人都可以向我解釋通過fnplot以及它如何區別於傳遞函數指針作爲參數的機制是什麼?

回答

7

void foo(double fn(double))void foo(double (*fn)(double))之間絕對沒有區別。兩者都聲明將函數的指針作爲參數的函數。

這與在void bar(double arr[10])void bar(double* arr)之間沒有區別的方式類似。

+0

你有關於陣列你的第二個要求的參考?特別是當它是C++? – krlmlr 2012-02-04 09:13:59

+0

有一點區別,在前者中,'fn'是一個指向函數的指針,而在後者中'fn'被顯式聲明爲指向函數 – 2012-02-04 09:14:27

+3

@ user946850:'§8.3.5/ 5'的指針:... After確定每個參數的類型,將「T數組」或「返回函數T」的類型參數分別調整爲「指向T的指針」或「返回函數的指針T」。 ... – Mankarse 2012-02-04 09:21:53

0

抱歉我的錯誤。

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; 
} 
+0

請再讀一遍我的問題。我詢問參數列表中的函數指針與參數列表中的函數原型之間的區別。 – MrOrdinaire 2012-02-04 09:26:05

+0

我的錯。我寫了一個新的答案。 – for1096 2012-02-04 09:40:29