数组的指针以外,还可以是函数的指针。
函数的指针可以作为函数参数,在函数调用时可以将某个函数的首地址传递给被调用的函数,使这个被传递的函数在被调用的函数中调用(看上去好象是将函数传递给一个函数)。函数指针的使用在有些情况下可以增加函数的通用性,特别是在可能调用的函数可变的情况下。
例10-15:编制一个对两个整数a,b的通用处理函数process,要求根据调用process时指出的处理方法计算a,b两数中的大数、小数、和。 解:
int max(int ,int ); 声明3个处理函数(只需要形参类型) int min(int ,int ); int add(int ,int ); 否则编译器不知道max,minint add1(int); 是变量还是什么其它符号 main() { int a,b; printf(\ printf(\调用通用处理函数 */ printf(\ printf(\虚实结合时,函数指针赋值 printf(\} int max(int x,int y){ return x>y?x:y; } /* 返回两数之中较大的数 */ int min(int x,int y){ return x 说明: (1) 函数process处理两个整数数,并返回一个整型值。同时又要求process具有通 用处理能力(处理求大数、小数、和),所以可以考虑在调用process时将相应的处理方法(“处理函数”)传递给process。 (2) process函数要接受函数作为参数,即process应该有一个函数指针作为形式参数,以接受函数的地址。这样process函数的函数原型应该是: int process(int x,int y,int (*f)()); (3) “函数指针作为函数参数”的使用与1、4、1节介绍的步骤完全相同,即函数 指针变量的定义-在通用函数process的形参定义部分实现;函数指针变量的赋值-在通用函数的调用的虚实结合时实现;用函数指针调用函数-在通用函数内部实现。 (4) main函数调用通用函数process处理计算两数中大数的过程是这样的: ? 将函数名max(实际是函数max的地址)连同要处理的两个整数a,b一起作为process 函数的实参,调用process函数。 ? process函数接受来自主调函数main传递过来的参数,包括两个整数和函数max 的地址,函数指针变量f获得了函数max的地址。 ? 在process函数的适当位置调用函数指针变量f指向的函数,即调用max函数。本 例直接调用max并将值返回。这样调用点就获得了两数大数的结果,由main函数printf函数输出结果。 同样,main函数调用通用函数process处理计算两数小数、和的过程基本一样。 (5) 教材:P158,process函数头部:函数指针定义中不需要指定形参个数。但是 一般情况函数指针指向的函数参数个数一般是数量类型相同的,以便用统一的格式如(*f)(x,y)去调用。 process函数是一个“通用”整数处理函数,它使用函数指针作为其中的一个参数,以实现同一个函数中调用不同的处理函数。 10、5 返回指针值的函数 函数可以返回整型、实型、字符型等类型的数据,还可以返回地址值-即返回指针值。 返回指针值的函数定义:类型名 * 函数名(参数表) 例如: int *fun(int x,int y)表示func是返回整型指针的函数,返回的指针值指向一个整型数据。该函数还包含两个整型参数x,y。 系统内存分配函数void *malloc(size_t size);也是一个返回指针值的函数。返回的指针指 向一片分配好的内存空间。 例10-16:返回两个数中大数地址的函数。 int *fun(int,int); main() { int i,j,*p; printf(\ p=fun(i,j); /* 调用fun,返回大数地址,赋值给指针变量p */ printf(\打印p指向的数据 */ } int *fun(int x,int y) /* fun函数返回形参x,y中较大数的地址(指针) */ { int *z; if(x>y)z=&x; else z=&y; return z; } 结果: enter two num to i,j:12 38 max=38 说明: (1) main函数从键盘获得两个整数i,j(本例12,38)。将i,j作为实参调用fun。 (2) 通过虚实结合,fun函数的形参x,y获得了这两个整数(本例12,38),将大 数的地址返回(本例是&y)。 (3) 返回的地址值赋值给main函数的指针变量p,main函数打印p指向的整型数,即y的值。 思考: 阅读下面的程序,分析结果,为什么会是这样? int *fun(int,int); int add(int,int); main() { int *p,i,j,sum; printf(\ p=fun(i,j); sum=add(444,444); printf(\} int *fun(int x,int y) { int *z; if(x>y)z=&x; else z=&y; return z; } int add(int a,int b) { return a+b; } 结果: enter two num to i,j:12 38 max=444 sum=888 10、6 指针数组与指向指针的指针 10、6、1 指针数组 数组的指针:指向数组元素的指针。数组元素可以是一般数据类型,也可以是数组、结构体等数据类型。数组指针的定义与数组元素指针的定义相同。 指针数组:一个数组,如果其数组元素均为指针,那么此数组为指针数组。
相关推荐: