如何解决如何使用位于结构中的函数指针运行函数? (C)
我想根据一个结构体定义创建一个结构体数组,并用不同的 int 值初始化每个结构体。
然后,我想使用指向 function pointer
的 print 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 pointer
和 structs
的想法,所以我很高兴能得到一些提示和建议,以帮助我理解这里的错误。
谢谢。
解决方法
与通常的指针一样,您必须先设置一个指针值,然后才能使用它。以便它指向某个地方。
添加:
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 举报,一经查实,本站将立刻删除。