1

だから私は関数へのポインタを練習していて、この簡単なプログラムを作ってみました.これはそのスニペットです. アドレスの割り当てに関しては、「無効な左辺値」というエラーがまだ表示されます。たとえば、 funcptr = &addnum です。また、これが何の役に立つのだろうかと思わずにはいられません。関数を呼び出す方がはるかに簡単ではありませんか? それとも私は何かを誤解していますか

#include <stdio.h>
int arithnum(int base);
int addnum(int base,int new);
int subnum(int base,int new);
int mulnum(int base,int new);
int divnum(int base,int new);
typedef int *ptrdef(int,int);
int arithnum(int base)
{
    char operator;
    int operand;
    ptrdef funcptr;
    printf("Enter operator: ");
    scanf("\n%c",&operator);
    printf("Enter second operand: ");
    scanf("%d",&operand);
    switch(operator)
    {
        case '+':
            funcptr = &addnum;
            break;
        case '-':
            funcptr = &subnum;
            break;
        case '*':
            funcptr = &mulnum;
            break;
        case '/':
            funcptr = &divnum;
            break;
    }
    return funcptr(base,operand);
}
4

2 に答える 2

1

ITYM

typedef int (*ptrdef)(int,int);

あなたのバージョンはint *しばらくの間を返す関数なので、。を返す関数ポインタが必要ですint


ヒント:次のことは常識ではないことは知っていますがtypedef、関数自体を優先して実行します

typedef int myfunc(int,int);
myfunc therealfunction; // bites me if I do a mistake
int therealfunction(int a, int b)
{
    // do stuff and
    return 42;
}
myfunc * funcptr = &therealfunction;

の宣言を誤って変更した場合に、警告ではなくエラーに噛まれる可能性がありますtherealfunction

于 2012-09-12T07:20:36.320 に答える
1

タイプ定義を変更します。

変化する:

typedef int *ptrdef(int,int);

typedef int (*ptrdef)(int,int);

他の質問/ステートメントに答えるには:「関数ポインターは役に立たないようです」:あなたの例では、それらの使用は簡単ですが、より便利な例は C++ の vtables です。関数ポインターを使用すると、基本クラスで関数のシグネチャを定義でき、サブクラスでそれらの関数ポインターを独自の実装に置き換えて、オブジェクトが関数に応答する方法を変更できます。

また、メイン アプリケーションがプラグインと動的にリンクし、プラグインが要求されたインターフェイスの関数ポインターの構造を返す COM モデル API でそれらを使用することもできます。

于 2012-09-12T07:19:19.747 に答える