6.6 函数指针与指针识别
2016-06-13 09:02
176 查看
函数指针及其应用
◆ 1、函数名与函数指针函数名对应于该函数执行代码的入口地址。通过取地址运算符“&”也可以取得函数的入口地址。指向函数的指针可以作为函数的参数传递。定义方式如下:
返回类型
(*指针变量名)(参数表)
由于一个函数不能以函数作为参数,所以当一个函数需要将函数作为参数时必须借用指向函数的指针(也可以用包含该函数的类对象)。
◆ 2、函数指针的使用方法
如有函数void scopy(char *q,char *p),函数名scopy代表函数的入口地址,或者说是一个指向该函数的指针,该指针的类型为:
void (*)(char *q,char *p) //q与p写与不写是一样的
定义这种函数指针类型的变量pf并用scopy初始化:
void(* pf)(char *,char *)=scopy; //或者=&scopy,两者等效
pf将存储scopy函数的入口地址。
【例6.13】梯形法求积分的函数integer()作为通用函数,可求任一函数的定积分。(查看源码)
指向类成员的指针
◆ 1、指向类成员函数的指针在类对象中有隐含的this指针,用以正确访问成员函数。所以指向类成员函数的指针有其特殊性。
成员函数有一个非成员函数没有的属性:它所属的类(class)。所以指向成员函数的指针需要三个方面的匹配:参数的类型和个数,返回类型和所属的类类型。
普通函数指针存储函数的地址,可以直接用来调用指定函数。成员函数指针必须首先被绑定在一个对象或指针上,才能获得被调用对象的this指针,然后才能调用指针所指向的成员函数。虽然两者都被称为指针,但是它们是不同类型的数据。
◆ 2、指向类成员函数的指针的说明及初始化
以指向商品类 GetPrice()函数的指针为例:
float (CGoods::*pf)()= CGoods::GetPrice;
◆ 3、成员函数指针的用法(绑定)
CGoods car;
(car.*pf)();
//将指针pf与对象car绑定,最终等效调用car. GetPrice ();
上式表示指针pf与对象car绑定,指向了car. GetPrice ()。所以指向成员函数的指针存储的不是成员函数的地址,绑定后才获得地址。
也可以用对象代替类进行初始化,效果一样:
CGoods car,motor;
float (CGoods::*pf)()=motor.GetPrice;
//等效float (CGoods::*pf)()= CGoods::GetPrice; 并未绑定
(car.*pf)(); //将指针pf与对象car绑定
指针的识别方法
◆ 1、复杂说明的阅读和理解的方法说明中包括多种说明符容易造成阅读和理解的困难。
一种理解和构造对象说明的方法是:先撇开标识符,按从右到左的顺序逐个解释每个说明符,如果有括号则改变解释的先后,先解释括号内再解释扩号外。例如:
int *arrp[5];
按下列顺序理解:五个元素的数组、每个元素是一个指针、指针指向整型,所以arrp是一个有五个整型指针作为数组元素的数组。又如:
int (*parr)[5];
按下列顺序理解:是一个指针,指针指向一个包含五个元素的数组,每个元素是一个整型,所以parr是一个指向五个整型数的数组的指针。
◆ 2、复杂说明的实例
int i, *ip, f(), *fp(), (*pf)();
*(*pfp)(), a[5], *ap[5], (*pa)[5], (*(*fap)[])();
答案:
i —— 是一个整型的变量;
ip—— 是一个指向整型变量的指针,即 ip 中存储的是另一个整型变量的地址;
f —— 是一个返回整型值的函数;
fp—— 是一个返回整型指针的函数,即 fp 返回的是一个指向整型变量的指针;
pf—— 是一个指向返回整型值的函数的指针;
pfp——是一个指向函数的指针,该函数返回一个整型指针;
a —— 是一个有五个整型元素的数组;
ap—— 是一个指针数组,每个元素是一个指向整型的指针;
pa—— 是一个指向整型数组的指针,该数组有五个整型元素;
fap——是一个指向数组的指针,该数组的每个元素都是一个指向函数的指针,而所指的函数的返回值是整型。
相关文章推荐
- 大龄程序员的未来在何方
- 解决浏览器分辨率问题
- Android_TextSwitcher和ImageSwitcher
- FIR IP
- 6.5 索引查找与指针数组
- 端口号协议
- BST——最短路径
- 6.4 常用的排序方法
- VB链接远程Oracle代码
- Java使用递归解决算法问题的实例讲解
- Excel Sheet Column Title
- 6.3 常用的查找方法
- 基于Bmob平台的账户登录、文件上传及下载逻辑的实现
- C语言如何从指定行读取文件
- 6.2 C++模板-类模板与线性表
- 读《出梁庄记》乱摘2
- js 连续赋值的简单实现
- 6.1 C++模板-函数模板
- 对XListView 原理的理解
- Linux-HA Heartbeat Keepalived