0

このような関数へのポインターを持つ構造体がある場合

struct str{
 int some_element;
 char other_element;
 int (*my_pointer_to_a_function)(int);
};

struct str my_struct;
int my_function(int);

それに値を割り当てます

my_struct.some_element = 1;
my_struct.other_element = 'a';
my_struct.my_pointer_to_a_function = my_function;

ポインターが指している関数を (ポインターを使用して) 呼び出すにはどうすればよいですか? 私の最初の推測はこれです:

my_struct.(*my_pointer_to_a_function)(value);

それともそうあるべきか

 *my_struct.my_pointer_to_a_function(value);

?

ありがとうございました。

4

3 に答える 3

4

関数へのポインターは、逆参照なしでそのまま使用できます。

my_struct.my_pointer_to_a_function(value)

しかし、逆参照を主張する場合は、次のように括弧を使用する必要があります。

(*my_struct.my_pointer_to_a_function)(value)

どちらも完全に同等なので、最初の方をお勧めします。

あなたについて最初に試してください:

my_struct.(*my_pointer_to_a_function)(value); //Error!

括弧内の式を最初に評価する必要があるため、それは機能しません: *my_pointer_to_a_function、しかしそれだけでは何の意味もありません。

そしてあなたの2番目:

*my_struct.my_pointer_to_a_function(value); //Error!

演算子の優先順位規則は、最初に を評価し.、次に関数呼び出しを評価し、最後に を評価します*

*(my_struct.my_pointer_to_a_function(value)); //Error!

そのため、関数が呼び出されますが、呼び出しの結果 anintが逆参照されるため、エラーが発生します。

于 2013-07-25T07:48:06.827 に答える
2

次のようなメンバーを構造化するときに、関数へのポインターがあるとします。

    struct newtype{
        int a;
        char c;
        int (*f)(struct newtype*);
    } var;
    int fun(struct newtype* v){
        return v->a;
    }

次のように呼び出すことができます。

    int main(){
        var.f=fun;
        var.f(&var);
     //  ^.....^..... have to pass `var` as an argument to f() :( :(
    }

 //Comment: here in var.f(&var); I miss this pointer and C++,      

だからあなたの場合、それはちょうどあるはずですmy_struct.my_pointer_to_a_function(value);

追加のポイント:
私の例では、同じ構造変数のメンバーにアクセスしたい場合でも、それを渡す必要があることに注意してください。(C++ オブジェクトとはまったく似ていません!)
C++ クラスの仮想関数。これらは内部で同様の方法で実装されています。

使用に役立つプロジェクトは次のとおりです。構造内の関数ポインター

于 2013-07-25T07:47:51.700 に答える
-1

これを使って:

#define function mystruct.my_pointer_to_a_function

次に、関数を呼び出すことができます:

int i = function(value);
于 2013-07-25T07:51:08.600 に答える