C++函数指针
面试的时候被某公司问道是否知道函数指针,我说知道呀。然后让我分析一下qsort的源码,傻了,完全没想过这个事。
什么是函数指针呢,顾名思义,指向函数的指针,而不是指向一个对象。
例如:
bool (*pf)(const string &str1, const string &str2);
对于一个对象的类型一般可以通过从内向外的方法来理解,pf前面有个*,是指针,后面有个括号,括号内是参数类型,那么这个指针是指向参数列表为(const string & , const string &)函数的,并且这个函数的返回类型在前面 是bool型的。
对于函数指针来说,不存在类型的转换,需要精确的匹配(目前我是这样理解的。)
例如:
void ff(int *);
void ff(unsigned int *);
用函数指针分别指向这两个函数为:
void (\*pf1) ( int *) = ff;
void (\*pf2) (unsigned int *) =&ff;
喂喂,好像上面那种没有加&啊,不过对于函数指针来说,应该是一样的,我是认为下面这种更好理解一点。
在函数中,不能定义函数类型的形参,但是可以使用函数指针。
void Bigger( const int &a , const int &b , bool pBigger(const int &, const int &));
这里第三个参数明明是一个函数啊! 然而它是等效于一个指针来使用的。上面等价于
void Bigger( const int &a , const int &b , bool (*pBigger)(const int &, const int &));
大概了解了函数指针,qsort是怎么实现的呢。qsort因为是一个通配的程序,不会对每个类型写一个qsort程序,所以它要匹配不同的类型。那么这里就需要用的void 指针。
void 指针有如下几个特点:
1. void指针没有类型
2. 任何类型的指针都可以赋给void指针,且不需要做类型转换,void指针也只获得该类型变量的地址而不获得大小
3. void指针转换为其他任何类型的指针都需要类型转换, 如: void* -> int* , 要转换成int – > (int *)a
4. void指针在转型前是不能解引用的
5. void指针在转型前不能参与指针运算,如++,–等
qsort()中使用到了void型指针,qsort函数可以简单表述为
qsort(void *base, size_t Len, size_t width, int (*cmp)(const void *, const void *));
其中
base : 需要排序的数组,支持各种数据类型
Len : base中的元素个数
width:base中没个元素所占用的字节数
cmp : 比较函数