我知道这是一个重复的。我已经搜索过了,但没有一个能解决我遇到的问题。注意,为了挑出我的困惑,我试图简化原始的打字。希望这不是未定义的行为
声明指向函数的指针
Int (*funcPtr)(void*,void*);
斯特罗姆普宣言
int strcmp (char *, char *);
类型转换函数指针
FuncPtr = (int (*)(void*, void*))strcmp
这就是我感到困惑的地方。我了解类型转换我们创建的函数指针。因此,例如,类型转换 FuncPtr 只是更改funcPtr可以指向的函数类型。我还读过,函数的名称是指向自身的函数指针,因此Typecast strcmp并使用我从上面的理解,
int (*)(void*, void*))strcmp
Strcmp现在可以指向一个函数,该函数需要两个指针来 void 并返回一个 int,这显然是错误的,就像数组一样,我认为函数名称不能是指向另一个函数的指针。
由于我上面的理解,我看不到如何使用以下类型转换将strcmp的地址分配给FuncPtr
FuncPtr = (int (*)(void*, void*))strcmp
因为更改函数指针strcmp指向的内容不会更改strcmp的参数和返回类型。
我真的很感激一些我只是很困惑的知识。
有函数,也有函数指针。strcmp
是一个函数,链接到您的项目。在表达式中使用标识符strcmp
时,您将获得指向该函数的函数指针。但是你不能改变"strcmp 指向的位置"strcmp
因为它是一个函数而不是一个指针。
C 允许不同函数指针类型之间的转换。但是,如果尝试通过不兼容类型的函数指针调用函数,则会调用未定义的行为。
int (*funcPtr)(void*,void*);
与具有以下格式的strcmp
不兼容:
int strcmp(const char *s1, const char *s2);
意义:
funcPtr = (int(*)(void*, void*))strcmp; // this is ok but not very meaningful
funcPtr(); // this is NOT ok, invokes undefined behavior
为了通过该函数指针实际调用strcmp
函数,您必须转换回正确的类型,即int (*)(const char*, const char*)
。