C++函数指针
2016-04-16 17:00
351 查看
C++函数指针
面试的时候被某公司问道是否知道函数指针,我说知道呀。然后让我分析一下qsort的源码,傻了,完全没想过这个事。
什么是函数指针呢,顾名思义,指向函数的指针,而不是指向一个对象。
例如:
bool (*pf)(const string &str1, const string &str2);
对于一个对象的类型一般可以通过从内向外的方法来理解,pf前面有个*,是指针,后面有个括号,括号内是参数类型,那么这个指针是指向参数列表为(const string & , const string &)函数的,并且这个函数的返回类型在前面 是bool型的。
对于函数指针来说,不存在类型的转换,需要精确的匹配(目前我是这样理解的。)
例如:
用函数指针分别指向这两个函数为:
喂喂,好像上面那种没有加&啊,不过对于函数指针来说,应该是一样的,我是认为下面这种更好理解一点。
在函数中,不能定义函数类型的形参,但是可以使用函数指针。
这里第三个参数明明是一个函数啊! 然而它是等效于一个指针来使用的。上面等价于
大概了解了函数指针,qsort是怎么实现的呢。qsort因为是一个通配的程序,不会对每个类型写一个qsort程序,所以它要匹配不同的类型。那么这里就需要用的void 指针。
void 指针有如下几个特点:
1. void指针没有类型
2. 任何类型的指针都可以赋给void指针,且不需要做类型转换,void指针也只获得该类型变量的地址而不获得大小
3. void指针转换为其他任何类型的指针都需要类型转换, 如: void* -> int* , 要转换成int – > (int *)a
4. void指针在转型前是不能解引用的
5. void指针在转型前不能参与指针运算,如++,–等
qsort()中使用到了void型指针,qsort函数可以简单表述为
其中
base : 需要排序的数组,支持各种数据类型
Len : base中的元素个数
width:base中没个元素所占用的字节数
cmp : 比较函数
面试的时候被某公司问道是否知道函数指针,我说知道呀。然后让我分析一下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&C++在函数使用上的差异
- 【学习C++】C++ Primer Plus (第六版)第七章编程练习6-10
- C++拷贝构造函数详解
- C++之再续前缘(二)——类和对象(上)
- C++模板函数
- C++中的explicit关键字介绍
- C++中的explicit关键字介绍
- Effective C++笔记(二):构造/析构/赋值运算
- C++中的endl搭配cout和cin用法
- Flatten Nested List Iterator leetcode 341
- C/C++编程规范
- 分析C语言的声明的优先级
- int a[], &a与a的区别
- C++ primer 5th 习题之4.21
- c语言中memset()的用法
- MySQL Connector/C++ 操作MySQL数据库(例程)
- C++ Queues(队列)
- C++新手之全局变量
- C++ Lists(链表) 4000