指向函数的指针结构

时间:2013-07-25 07:42:43

标签: c pointers struct

如果我的结构具有指向像这样的函数的指针

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);

谢谢。

3 个答案:

答案 0 :(得分: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!

这是行不通的,因为必须首先评估parenthersis中的表达式:*my_pointer_to_a_function,但这本身就没有任何意义。

你的第二个:

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

运算符优先级规则首先评估.,然后是函数调用,最后评估*

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

因此将调用该函数,但调用的结果int将被取消引用,因此错误。

答案 1 :(得分: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 ++类中的虚函数。它们在引擎盖下以类似的方式实现。

这是一个可以帮助您使用的项目:Function pointers inside structures

答案 2 :(得分:-1)

使用此:

#define function mystruct.my_pointer_to_a_function

然后你可以调用函数:

int i = function(value);