Sim*_*le 3 c function-pointers typecast-operator
我知道这是重复的.我已经搜索过,但没有人解决我遇到的问题. 注意,为了解决我的困惑,我试图简化原始的类型转换.希望它不是未定义的行为
声明指向函数的指针
Int (*funcPtr)(void*,void*);
Run Code Online (Sandbox Code Playgroud)
Strcmp声明
int strcmp (char *, char *);
Run Code Online (Sandbox Code Playgroud)
类型化一个函数指针
FuncPtr = (int (*)(void*, void*))strcmp
Run Code Online (Sandbox Code Playgroud)
这是我感到困惑的地方.我理解Typecasting我们创建的函数指针.因此,类型转换FuncPtr例如只是更改funcPtr可以指向的函数类型.我还读过一个函数的名称是一个函数指针,所以Typecasting strcmp并使用我从上面的理解,
int (*)(void*, void*))strcmp
Run Code Online (Sandbox Code Playgroud)
Strcmp现在可以指向一个函数,该函数接受两个void指针并返回一个明显错误的int,就像数组一样,我认为函数名不能是指向另一个函数的指针.
由于我上面的理解,我没有看到如何 使用以下类型转换将strcmp的地址分配给FuncPtr
FuncPtr = (int (*)(void*, void*))strcmp
Run Code Online (Sandbox Code Playgroud)
作为改变什么函数指针的strcmp点不会改变参数和返回类型的strcmp.
我真的很感激一些我很困惑的知识.
有函数,还有函数指针.strcmp是一个与您的项目相关联的函数.strcmp在表达式中使用标识符时,您将获得指向该函数的函数指针.但是你不能改变"strcmp指向的地方",因为它strcmp是一个函数,而不是一个指针.
C允许不同函数指针类型之间的转换.但是,如果尝试通过不兼容类型的函数指针调用函数,则调用未定义的行为.
int (*funcPtr)(void*,void*);
Run Code Online (Sandbox Code Playgroud)
与之不兼容strcmp,具有以下格式:
int strcmp(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)
含义:
funcPtr = (int(*)(void*, void*))strcmp; // this is ok but not very meaningful
funcPtr(); // this is NOT ok, invokes undefined behavior
Run Code Online (Sandbox Code Playgroud)
为了strcmp通过该函数指针实际调用该函数,您必须转换回正确的类型,即int (*)(const char*, const char*).