'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 *
是对象指针,但是您可能使用的大多数实现仍然支持它。
更具体地说,这 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 *
是对象指针,但是您可能使用的大多数实现仍然支持它。