C语言中函数指针在数据结构开发中的使用

时间:2018-12-13 15:21:35

标签: c data-structures function-pointers

下个学期我正在上一门算法课程,所以我涉足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语言中研究数据结构和算法的范围内有用吗?还是只是占用数据结构上的内存?

我找到了其他有关函数指针的文章,但是没有一篇探讨这种方法。我认为这可能对一群好奇的学生有用:)

2 个答案:

答案 0 :(得分:1)

过去,我确实看到过这样构造的对象,它们是有效表示vtable的一组函数指针。通常,对于vtable,您要添加一个额外的间接级别,以便具有相似特征的所有数据对象都指向同一函数指针对象。如果有多个功能,这将减少每个数据对象的成本,但执行成本会很小。

通过坚持数据的第一个成员是回调函数,它也可以用作组织和构造函数+ voiddata回调对象的轻量级方法。当然,您不能使用c定义继承的类,但是可以使用嵌套结构以达到相同目的。

答案 1 :(得分:0)

阅读所有答案之后,这是本文收集的关于将函数指针用作C结构属性的见解。

优势:

  • 如果您是学生,则可以在某些高级学科上进行良好的练习
  • 在C中提供封装和面向对象的代码
  • 如果您还不熟悉面向对象的编程范例,则可以使您更好地了解它。
  • 可用于实现VTables

缺点:

  • 在功能级别上,您仍然必须将数据结构传递给该函数,因为它无法访问所述数据结构
  • 轻微的性能开销

总而言之,只有在希望探索OOP并同时深入C的更高级方面或构造VTable的情况下,如最初问题中那样使用函数指针才真正具有实际用途。

感谢所有答复的人。