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

Difference between 'void *' and 'void * (*function)(void *)' initialization, casting, and function pointer calls?

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

我的理解是:

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

可以通过 member/object 类型进行转换,只要编译器具有该对象的有效类型信息声明,包括符号 table 中的存储限定符和说明符吗?

例如:

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

或者在函数的情况下:

void * (* function)(void *);

我的理解是对象命名了一个指向函数的指针,该函数接受一个指向未知对象的指针或函数指针,returns 一个指向未知对象或函数指针的指针。函数 calling/dereferencing 不清楚。据说对初始化对象声明的 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);

这个分组是如何工作的?

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

在这个例子中:

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

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

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

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