2009-08-14 20 views
3

どのように私は "関数ポインタ"(と(例えば、関数がパラメータを持っている)をCで作成できますか?関数ポインタCで

+0

[Cの関数ポインタはどのようにして動作するのですか?](0120-385-006) –

答えて

15

http://www.newty.de/fpt/index.html

typedef int (*MathFunc)(int, int); 

int Add (int a, int b) { 
    printf ("Add %d %d\n", a, b); 
    return a + b; } 

int Subtract (int a, int b) { 
    printf ("Subtract %d %d\n", a, b); 
    return a - b; } 

int Perform (int a, int b, MathFunc f) { 
    return f (a, b); } 

int main() { 
    printf ("(10 + 2) - 6 = %d\n", 
      Perform (Perform(10, 2, Add), 6, Subtract)); 
    return 0; } 
+0

興味深い例 - *追加*フロートと2つの文字? –

+0

もちろん、 'z'に3.145を追加して結果を整数として返すことをいつも望んでいないのですか?私はこの例を少し辛口なものに変更します。 –

5
typedef int (*funcptr)(int a, float b); 

    funcptr x = some_func; 

    int a = 3; 
    float b = 4.3; 
    x(a, b); 
0

私は関数ポインタへの最初のダイビングだったとき、私は、このサイトが役に立ったと評価してい。

http://www.newty.de/fpt/index.html

0

まず関数ポインタ宣言:関数プロトタイプとほぼ同じ

typedef int (*Pfunct)(int x, int y); 

を。
しかし、あなたが作成したのは一種の関数ポインタ(typedef)です。
は、だから今は、その型の関数ポインタを作成します。

Pfunct myFunction; 
Pfunct myFunction2; 

は今、それらに機能アドレスを割り当て、それらが機能しているようにあなたがそれらを使用することができます。

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

int subtract(int a, int b){ 
    return a - b; 
} 

. . . 

myFunction = add; 
myFunction2 = subtract; 

. . . 

int a = 4; 
int b = 6; 

printf("%d\n", myFunction(a, myFunction2(b, a))); 

関数ポインタはとても楽しいです。

0

また、我々が機能するためにポインタの配列を作成することができます。

double fun0(double x, double y) { 
    return x + y; 
} 

double fun1(double x, double y) { 
    return x - y; 
} 

double fun2(double x, double y) { 
    return x/y; 
} 

int main(int argc, char*argv[]) { 
    const int MaxFunSize = 3; 

    double (*funPtr[MaxFunSize])(double, double) = { fun0, fun1, fun2 }; 

    for(int i = 0; i < MaxFunSize; i++) 
     printf("%f\n", funPtr[i](2.5, 1.1)); 
    return 0; 
} 
0

ます。また、関数へのポインタを返す関数を定義することができます。

int (*f(int x))(double y); 

fは単一のintパラメータをとる関数でありますdoubleパラメータをとり、intを返す関数へのポインタを返します。