您的位置:首页 > 编程语言 > C语言/C++

C++函数指针

2016-04-16 17:00 351 查看
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 : 比较函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++函数指针