如何 运行 使用位于结构中的函数指针的函数? (C)
How to run a function using a function pointer that located in a struct? (C)
我想根据一个结构定义创建一组结构,并用不同的 int 值初始化每个结构。
然后,我想打印这个值,使用指向 print function
的 function pointer
。
定义一个结构体(包括一个int和一个函数指针)。
创建一个包含 10 个相同定义结构的数组。
为每个设置不同的值。
为函数指向的函数发送此值
也位于 struct
中的指针
这是我的代码:
#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 );
}
我想根据一个结构定义创建一组结构,并用不同的 int 值初始化每个结构。
然后,我想打印这个值,使用指向 print function
的 function pointer
。
定义一个结构体(包括一个int和一个函数指针)。
创建一个包含 10 个相同定义结构的数组。
为每个设置不同的值。
为函数指向的函数发送此值
中的指针
也位于 struct
这是我的代码:
#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 );
}