C语言 类型转换函数指针



我知道这是一个重复的。我已经搜索过了,但没有一个能解决我遇到的问题。注意,为了挑出我的困惑,我试图简化原始的打字。希望这不是未定义的行为

声明指向函数的指针

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*)

最新更新