微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

然后,我想使用指向 function pointerprint function 打印此值。

这是我的代码

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。