C中函数指针在数据结构开发中的使用
Use of function pointers in C on data structure development
我下学期要上算法课程,所以我开始学习 C,目的是提前制作一些数据结构以备不时之需。
当我了解函数指针时,我发现我可以将它们存储在 structs
中并为我的数据结构创建类似面向对象的用途。这是一个例子:
#include <stdio.h>
void insert(char * object)
{
printf("Adding %s to the data structure\n", object);
}
typedef struct data_structure {
char * obj;
void (*insert)(char * object);
} data_structure;
int main()
{
data_structure d;
d.insert = insert;
d.insert("bacon");
return 0;
}
但是这种程序在学C的数据结构和算法的范围内真的有用吗?还是只是占用了数据结构上的内存?
我发现其他帖子讨论函数指针,但 none 探索了这种方法。我认为这可能对一群好奇的学生有用:)
过去我确实看到过以这种方式构造的对象作为有效地表示 vtable 的函数指针集。通常,对于 vtable,您会添加一个额外的间接级别,以便所有具有相似特征的数据对象都指向同一个函数指针对象。如果有超过 1 个函数,这会降低每个数据对象的成本,但执行成本很小。
通过坚持数据的第一个成员是回调函数,它也可以用作组织和构造 function+voiddata 回调对象的轻量级方式。当然,你不能用c定义继承类,但你可以有嵌套的结构,它们可以被欺负到同样的目的。
阅读所有答案后,下面是此 post 收集的有关将函数指针用作 C 结构属性的见解。
优点:
- 如果您是学生,可以练习一些高级科目
- 在 C
中提供封装和面向对象的代码
- 让您更好地理解面向对象的编程范式(如果您还不熟悉的话)
- 可用于实现 VTables
缺点:
- 在功能层面上,您仍然必须将数据结构传递给函数,因为它无法访问所述数据结构
- 轻微的性能开销
总而言之,如果人们希望在探索 OOP 的同时进入 C 的更高级方面,或者构建 VTable,那么在原始问题中使用函数指针实际上只有实际用途。
感谢所有回复的人。
我下学期要上算法课程,所以我开始学习 C,目的是提前制作一些数据结构以备不时之需。
当我了解函数指针时,我发现我可以将它们存储在 structs
中并为我的数据结构创建类似面向对象的用途。这是一个例子:
#include <stdio.h>
void insert(char * object)
{
printf("Adding %s to the data structure\n", object);
}
typedef struct data_structure {
char * obj;
void (*insert)(char * object);
} data_structure;
int main()
{
data_structure d;
d.insert = insert;
d.insert("bacon");
return 0;
}
但是这种程序在学C的数据结构和算法的范围内真的有用吗?还是只是占用了数据结构上的内存?
我发现其他帖子讨论函数指针,但 none 探索了这种方法。我认为这可能对一群好奇的学生有用:)
过去我确实看到过以这种方式构造的对象作为有效地表示 vtable 的函数指针集。通常,对于 vtable,您会添加一个额外的间接级别,以便所有具有相似特征的数据对象都指向同一个函数指针对象。如果有超过 1 个函数,这会降低每个数据对象的成本,但执行成本很小。
通过坚持数据的第一个成员是回调函数,它也可以用作组织和构造 function+voiddata 回调对象的轻量级方式。当然,你不能用c定义继承类,但你可以有嵌套的结构,它们可以被欺负到同样的目的。
阅读所有答案后,下面是此 post 收集的有关将函数指针用作 C 结构属性的见解。
优点:
- 如果您是学生,可以练习一些高级科目
- 在 C 中提供封装和面向对象的代码
- 让您更好地理解面向对象的编程范式(如果您还不熟悉的话)
- 可用于实现 VTables
缺点:
- 在功能层面上,您仍然必须将数据结构传递给函数,因为它无法访问所述数据结构
- 轻微的性能开销
总而言之,如果人们希望在探索 OOP 的同时进入 C 的更高级方面,或者构建 VTable,那么在原始问题中使用函数指针实际上只有实际用途。
感谢所有回复的人。