更具体地说,这 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);
这个分组是如何工作的?
答案 0 :(得分:1)
A void *
不包含有关它指向的对象类型的信息。由程序员来跟踪它并将其转换回正确的指针类型。
在这个例子中:
struct Structure {void *member;} Structure;
Structure.member = &func;
将 Structure.member
视为函数是无效的,因为这不是它的类型。在调用之前,需要将其转换回正确的函数指针类型。因此,如果 func
被定义为 void func(void)
,您需要这样做:
((void (*)(void))Structure.member)();
此外,严格不允许将函数指针转换为对象指针,void *
是对象指针,但是您可能使用的大多数实现仍然支持它。