2017-05-08 119 views
2

我知道这是重复的。我已经搜索过,但没有解决我遇到的问题。 注意在试图单出我的困惑我试图从原来简化类型转换。但愿它不是不确定的行为输入函数指针

声明一个指向函数

Int (*funcPtr)(void*,void*); 

STRCMP声明

int strcmp (char *, char *); 

类型转换函数指针

FuncPtr = (int (*)(void*, void*))strcmp 

这是我弄糊涂。我明白我们已经创建了一个函数指针。因此,类型铸造FuncPtr例如,只是改变什么类型的功能funcPtr可以指向。我也看到,一个函数的名字是一个函数指针到自身,铸字STRCMP,并使用从上面我的理解,

int (*)(void*, void*))strcmp 

STRCMP现在可以指向需要两个指针作废的功能并返回一个int,它显然是错误的,就像数组我认为函数名称不能是指向另一个函数的指针。

因为我的理解上面我看不出你可以用下面的类型转换

FuncPtr = (int (*)(void*, void*))strcmp 

STRCMP的地址分配给FuncPtr作为改变什么函数指针STRCMP点没有按不会改变参数和返回类型strcmp

我真的很感谢一些知识,我只是很困惑。

+3

嗯,只是因为你可以,并不意味着这是个好主意。如果需要,我可以将我的车开到树上,但是...... – ThingyWotsit

+1

任何函数指针都可以指向任何函数,但不允许通过指针调用该函数,除非指向的类型与函数完全匹配指向 –

+0

“我认为函数名不能是另一个函数的指针”Eh?你什么意思?什么是'FuncPtr',什么类型?请注意,C语言区分大小写。 – Lundin

回答

4

有函数和函数指针。 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*)

+0

“函数名称(标签)被转换为指向自身的指针。” http://denniskubes.com/2013/03/22/basics-of-function-pointers-in-c/最后一章讨论这个 – Simple

+0

对于什么是cast(int(*)(void * ,void *)对strcmp有影响吗?它是否将参数类型更改为void并将类型返回为int – Simple

+0

@Simple它与strcmp没有任何关系,原因与“int x = 0; char * ptr =&x;'的作用相同没有指向'x'指针保存着一个指向物件的地址,因为你让一个不同类型的指针指向你的变量,这并不会改变变量本身的类型。 – Lundin