'void *' 和 'void * (*function)(void *)' 初始化、转换和函数指针调用之间的区别?

时间:2021-07-22 03:59:13

标签: c pointers casting structure

更具体地说,这 3 个指针在符号表和编译器中是如何工作的?

我的理解是:

void * object 是指向具有未指定类型的对象或函数的指针,它基本上需要对对象进行强制转换才能正确解释,例如 (int)object

只要编译器具有该对象的有效类型信息声明(包括符号表中的存储限定符和说明符),就可以按成员/对象类型进行转换吗?

例如:

void * object;
struct Structure {int member;} Structure;
printf("Object is: %d\n", (Structure->member)(*object));

或者在函数的情况下:

void * (* function)(void *);

我的理解是,对象命名一个指向函数的指针,该函数接受一个指向未知对象或函数指针的指针,该指针返回一个指向未知对象或函数指针的指针。函数调用/取消引用不清楚。假设赋值给初始化对象声明的 void * 对象应该假定它是从初始化的类型。

这些函数指针调用有什么区别?

    struct Structure {void *member;} Structure;
    Structure.member = &main();
    
   /*This assignment, based on my understanding, to Structure.member from main() is supposed to 
    *initialize ember to the type of main() which is assigned automatically or via memcpy()*/

    Structure.member(arg); 
    /*or:*/ 
    Structure.(*(member(arg))); 
    /*or:*/ 
    Structure.(*member(arg))); 

这种格式看起来是:

(cast_type) (return_object_type_qualifiers_specifiers)(object_name)(object_parameters);

这个分组是如何工作的?

1 个答案:

答案 0 :(得分:1)

A void * 不包含有关它指向的对象类型的信息。由程序员来跟踪它并将其转换回正确的指针类型。

在这个例子中:

struct Structure {void *member;} Structure;
Structure.member = &func;

Structure.member 视为函数是无效的,因为这不是它的类型。在调用之前,需要将其转换回正确的函数指针类型。因此,如果 func 被定义为 void func(void),您需要这样做:

((void (*)(void))Structure.member)();

此外,严格不允许将函数指针转换为对象指针,void * 是对象指针,但是您可能使用的大多数实现仍然支持它。

相关问题