在传递一个void* 指针作为函数的参数之后,有没有一种方法可以指定它被转换为另一个参数的类型。
struct A{
int key;
char c;
}
struct B {
int key;
float d;
}
有没有可能定义一个函数,
void func(void * ptr, ...){
//operate on key
}
并且在强制转换为void* 之后将指向任一结构体的指针传递给函数,并且从函数内访问键元素。
试图理解void* 的使用,结构定义是如何存储的(如何从结构定义中确定各种元素的偏移量?)以及多态性是如何在c中实现的。
我试着看看我是否能写二叉搜索树函数,可以处理任何结构的节点。
2条答案
按热度按时间3npbholx1#
在将void * 指针作为参数传递给函数后,是否有方法指定将其转换为另一个参数的类型。
是也不是。
我想你希望有一些特定的东西来实现这个目的,比如一个变量来传递一个类型名,函数可以用它来执行类型转换,比如C++模板中的类型参数,或者Java泛型方法,C没有这样的东西。
当然,你可以用一个普通的整数来传递一个代码,这个代码表示要强制转换到几个预先知道的类型中的哪一个。如果你愿意,你甚至可以用一个
enum
来给这些代码起一个有意义的名字。例如:请注意,这种方法允许访问所指向结构的 * 任何 * 成员,但如果您只想访问第一个成员,并且它在每个感兴趣的结构类型中都有相同的类型,那么您不需要知 prop 体的结构类型。在这种特殊情况下,您可以直接强制转换为成员类型:
这依赖于C语言的保证:指向任何结构的指针,经过适当的强制转换,都指向该结构的第一个成员。
试图理解void * 的使用,结构定义是如何存储的,多态性是如何在c中实现的。
太宽泛了。
C语言不提供多态性作为一种语言特性,并且C对象不携带关于其类型的信息,例如可用于分派类型特定函数的信息。当然,您可以自己实现它,但这并不是微不足道的。可用的方法包括,但不限于,
qsort()
和bsearch()
函数就是这种方法的典型例子。3htmauhk2#
假设你有一个sort函数,它把一个函数作为参数,实现了sort的“比较”功能,那么sort就可以对任意
struct
的列表进行排序,方法是给它一个比较器函数,为你的特定struct
实现正确的顺序。考虑以下
struct
定义:这个不起眼的链表定义:
它可以在
item
成员中存储任意的struct
。因为你知道你放在链表中的成员的类型,所以你可以写一个比较器函数来做正确的事情:
然后这样称呼你的同类:
为了完整起见,下面是bubbleSort实现: