C++函数指针

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 : 比较函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值