如何 运行 使用位于结构中的函数指针的函数? (C)

How to run a function using a function pointer that located in a struct? (C)

我想根据一个结构定义创建一组结构,并用不同的 int 值初始化每个结构。

然后,我想打印这个值,使用指向 print functionfunction pointer

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 10

void Print(int num);

typedef struct print_me
{
    int x;
    void (*Print)(int x);
};
    
struct print_me my_prints[ARRAY_SIZE];

int main()
{
    size_t i = 0;
    for (i = 0; i < ARRAY_SIZE; ++i)
    {
        my_prints[i].x = i;
        my_prints[i].Print(my_prints[i].x);
    }
    return 0;
}

void Print(int num)
{
    printf("%d\n",num);
}

我仍在学习 function pointerstructs 的思想,所以我很乐意得到一些提示和建议,帮助我理解这里的错误。

谢谢。

与通常的指针一样,您必须先设置一个指针值才能使用它。让它指向某个地方。

添加:

my_prints[i].Print = &Print;
// or, it means the same, & is optional
// my_prints[i].Print = Print;
my_prints[i].Print(my_prints[i].x); // now ok

在调用 my_prints[i].Print() 之前,指针将 指向 函数 Print 在调用它之前。

附带一个有趣的事实:由于奇怪的 C 规则,不需要取消引用函数指针,您甚至可以多次“取消引用”函数指针,例如 (****my_prints[i].Print)()。见前 this question.

对于初学者来说,在此声明中使用 typedef 说明符没有任何意义

typedef struct print_me
{
    int x;
    void (*Print)(int x);
};

没有指定 typedef 名称。你可以这样写

typedef struct print_me
{
    int x;
    void (*Print)(int x);
} print_me;

在for循环中需要用函数Print的地址初始化数据成员Print。例如

for (i = 0; i < ARRAY_SIZE; ++i)
{
    my_prints[i].x = i;
    my_prints[i].Print = Print;
}

然后在第二个for循环中你可以像

这样调用函数
for (i = 0; i < ARRAY_SIZE; ++i)
{
    my_prints[i].Print( my_prints[i].x );
}