函数指针的定义.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3
函数指针的定义形式为: type (*pf)(T1,T2 ); 类型 (*函数指针名)(类型1,类型2); 该定义语句引进函数指针pf,具有类型属性抽象为 type (*)(T1,T2),表示这个指针操作入口参数分别为T1,T2类 型的数据、返回type类型数据的函数。 如此定义的函数指针pf称为一级函数指针,由于函数类 型属性相同的代码其内存空间的长度是不一致的,因此不对 一级函数指针进行加减运算。 函数指针指向程序的代码区,数据指针指向数据存储 区。
5
对于变量定义语句: long (*p)(int,long); 类型抽象为long (*)(int,long),根据运算符的优先级和结 合性分解为: 1. (*),一个指针 2. (int,long) ,函数调用 3. long , long型的数据 编译系统根据运算的优先级别建立一个指针,这个指针 可以是局部作用域的,该指针用于函数调用,函数调用返回 long型的数据。
6
而对于函数原型说明语句: long *f(int,long); 类型抽象为long * (int,long)根据运算级别分解为: 1. (int,long) ,函数调用 2. *, 指针 3. long, long型的数据 系统理解f为一个函数名,函数名具有全局作用范围, 该函数返回一个指针,这个指针访问long型数据。 注意{ long (*p) [4][5];}是指向三维数组的指针定义。
10
[例]函数指针间接调用函数 #include<stdio.h> int max ( int x, int y){ return x>y?x:y;} int min ( int x, int y){ return x<y?x:y;} void main () { int ( *f ) ( int, int )=max; printf ( "%d,%d\t", max (2,3), f (5,4)); f=&min; printf (" %d,%d\t" , min (2,3), f (5,4)); } //输出:3,5
8
函数的地址在函数名中,取函数的地址不写成: pf= f(T1, T2); 上面这种写法遗漏了函数的返回类型信息。而是写成: pf= f; 设v1, v2分别是与T1, T2匹配的实参。函数指针赋值之 后就可以利用函数指针调用相关的函数,使用函数指针满足 函数虚实结合的规则,其使用的格式有两种如下: . 函数指针名(实参列表); pf(v1, v2); 此种函数指针作为函数名直接调用相关的函数,键入的 字符少,程序风格短小精悍。 (*函数指针名)(实参列表); (*pf)( v1, v2); 这种访问函数指针的形式调用相关的函数,类型属性清 晰可鉴一目了然。
9
如果pf是返回指针的函数,则pf( v1, v2)是指针表达 式,*pf( v1, v2)就是访问指针指向的内存。因此, (*pf)( v1, v2) 不写成 *pf( v1, v2), 这导致其它的语义或错误。 函数指针调用入口类型属性相同的函数称为函数的间接 调用。 函数指针调用的函数是函数指针最新指向的函数。 f(v1, v2)是直接调用,如果fp指向f,则 pf(v1, v2)是f函数的 间接调用。 如果fp指向fn,则此时pf (v1, v2)相当于fn(v1, v2)即pf 间接调用fn函数。
一、函数指针的定义 二、函数指针的使用 三、函数指针作为形参
1
一、函数指针的定义
函数是由执行语句组成的指令序列或代码,这些代码的 有序集合根据其大小被分配到一定的内存空间中,这一片内 存空间的起始地址就称为该函数的地址,不同的函数有不同 的函数地址,编译器通过函数名来索引函数的入口地址。
为了方便操作类型属性相同的函数,C/C++引进了函数 指针(function pointer)。 函数指针是指向函数代码入口地址的指针。
7
二、函数指针的使用
函数指针是函数代码入口地址的变量,本身不提供独立 的函数代码。访问函数指针之前需要初始化,函数名代表函 数代码的入口地址。 函数原型[type f(T1,T2);]中的f与函数指针pf具有类型 属性type (*)(T1,T2 ),f可以赋值给相同类型的指针pf。函数 指针初始化的形式有两种:一是直接赋值,二是加取地址运 算符赋值。格式如下: 函数指针名=函数名; 函数指针名=&函数名; 也可以在定义时进行初始化: type (*pf)(T1, T2 )= &f; type (*pf)(T1, T2 )= f;
Hale Waihona Puke Baidu
2
以两个入口参数为例, 设type,T1,T2,Tj,Tk是系统内置 的基本类型或用户已经声明的类型。考虑一系列函数的定义 或说明: type f(T1 a, T2 b) {语句序列;} type f1(T1 a1, T2 a2) ; ... type fn(T1 n1, T2 n2) {语句序列;} 为方便操作这些入口参数类型相同个数相同、返回类性 也相同、函数名称不同的函数,可以引进函数指针。重载函 数仅是函数名相同的函数。
4
函数指针用于共性地处理类型属性相同名称不同的函数 族,因此定义时不需要具体的形参名;多余地摆设形参名不 算错误,如: type (*pf)(T1 x,T2 y), 但形参名 x 和y形同虚设。 在函数指针定义语句中的圆括号绝对不能省略,如果省 略圆括号就成为下面形式: type *pf(T1,T2 ); 这是一个返回type*型的指针值的函数原型。函数指针 的定义语句涉及到内存的空间分配,定义的是一个函数指 针;函数原型说明仅只是告知编译器全局函数名是备案可查 的。定义语句是唯一的,说明语句则无妨有所重复。
2,4
11
在C++中函数指针只能指向类型属性相同的函数地址, 除非强制类型转换。因此定义语句{int (*f)(int,int)=max;}不 能写为{int (*f)()=max;},两边类型不一致。 早期C语言中这样写是可以的,但容易引起错误的调用 匹配。 不同类型的函数指针之间的赋值是危险的,可以通过强 制类型转换完成指针的映射,否则编译器或提出警告或弹出 错误显示。 函数指针与数据指针绝不相互赋值。不同类型的函数指 针强制类型转换之后发生的函数调用,如果不适当细心地予 以复原其结果是不确定的或未必是所需要的,因为两种函数 的实参个数、类型并不一致。
相关文档
最新文档