问个函数指针的问题,大虾帮忙解答下。
在书中看到个例题,里面有个函数调用是这个
(int(*)(void*,void*))numcmp
不太明白nucmp函数是怎么被转换为函数指针。
这也不是赋值,难道是numcmp的地址直接返回到前面的函数指针内?
哪位仁兄有关于这种传值的资料,共享下 嘿 谢谢了
[解决办法]
参考:
函数指针的几种用法
[解决办法]
函数调用和通过函数指针调用本质上一样的,所以你可以把numcmp看成一个函数指针。类型转换只是在调用检查上做了手脚。
[解决办法]
- C/C++ code
# include <stdio.h># include <stdlib.h>int numcmp(int * a, int * b){ return *a - *b;}int main(){ int a[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, }; int i; qsort(a, 10, sizeof(int), (int (*) (const void *, const void *))numcmp); for (i = 0; i < 10; i++) printf("%d\n", a[i]); return 0;}
[解决办法]
是强制转换,int(*)(void*,void*)中:(void*,void*)是参数,int是返回类型,(*)是函数名。
[解决办法]
(int(*)(void*,void*))numcmp
这是一个强制类型转换,楼主是否能看明白这个语法?
关于转换过程,其实说起来和编译器有关系了
numcmp()是一个函数,函数名在编译器看来就是一段代码的入口
这个所谓的入口就是一个地址,就是说程序从什么地方开始执行
这个地址,从C语言的角度来讲,就是一个指针(指针就是一个地址)
因此,函数名numcmp就是一个指针
上面的这段代码的意思,就是对一个指针进行了强制类型转换
关键问题,就是在于函数形式参数的类型上,void使得编译器不再进行检查
这种强转,是为了“照顾编译器的情绪”
一切责任就要由编码者负责了,必须保证代码能够合理的运行下去
不知道说到这里,楼主是否能明白了呢?
[解决办法]