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

C语言中函数指针在数据结构开发中的应用,c,data-structures,function-pointers,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 {

下学期我要上一门算法课程,所以我开始学习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;
}
#包括
空插入(字符*对象)
{
printf(“将%s添加到数据结构\n”,对象);
}
typedef结构数据_结构{
char*obj;
无效(*插入)(字符*对象);
}数据结构;
int main()
{
数据结构d;
d、 插入=插入;
d、 插入(“培根”);
返回0;
}
但是,这种过程在C语言中的数据结构和算法研究中真的有用吗?还是只是占用了数据结构上的内存


我还发现了其他关于函数指针的帖子,但没有一篇探讨这种方法。我认为这对一群好奇的学生来说可能很有用:)

在过去,我肯定看到过以这种方式构造的对象是一组函数指针,有效地表示vtable。通常,对于vtable,您会添加一个额外级别的间接寻址,以便所有具有类似特征的数据对象都指向同一个函数指针对象。如果有多个函数,这会降低每个数据对象的成本,但执行成本很低


它还可以作为一种轻量级的方式来组织和构造function+voiddata回调对象,方法是坚持数据的第一个成员是回调函数。当然,你不能用c定义继承类,但是你可以用嵌套结构来达到同样的目的。

在阅读了所有的答案后,下面是这篇文章收集到的关于函数指针作为c结构属性使用的见解

优点:

  • 如果你是一名学生,在一门稍微高级的学科上好好练习
  • 提供C语言中的封装和面向对象代码
  • 如果您还不熟悉面向对象的编程范例,则可以更好地理解它
  • 可用于实现VTables
缺点:

  • 在功能级别上,您仍然必须将数据结构传递给功能,因为它无法访问所述数据结构
  • 轻微的性能开销
总之,只有当一个人希望在探索OOP的同时了解C的更高级方面,或者构建VTables时,才能像最初的问题一样使用函数指针


感谢所有回复的人。

Google提供了类似“C语言通用链表”的内容。当我研究它的时候,它被命名为“ADT”(抽象数据类型),但很明显,用这个术语很难找到它,所以我认为它不常用于此目的。这是一种反模式,它只会让你得到更慢、更糟糕的代码。@Saucy对于初学者来说,insert无法插入任何内容,因为它无法访问数据结构,这意味着您必须将其作为参数传递。这反过来意味着您可以跳过函数指针。只要写一个函数并调用它,如果你想用C进行封装和编写OO代码,这实际上是正确的方法。但是,您必须将d作为“this”传递给insert函数,以允许它操作数据。C++基本上是在封面下面做同样的事情,用方法操作类,这个方法对于每个方法来说都是一个隐藏的参数。数据隐藏也可以通过将所有“私有”数据放入另一个内部结构并在该数据的父结构中有一个void*来实现。如果只在函数指针中使用一个函数,可能不会获得太多。如果要设置函数指针,使其在不同的时间指向不同的函数,那么在结构中使用指针可能会有好处。当您需要时使用它,而不是默认情况下(除非您发现自己在默认情况下需要它,因为您的编码风格)。