第十三章第十三章三论函数三论函数___ ___ 几个较深入的问题几个较深入的问题?函数指针?函数做参数?函数副作用?形式参数作实在参数?可变长度数组?本章小结函数指针函数指针在数组与指针一节中曾指出数组名表示数组首地址,若将数组名赋值给一个类型兼容的指针变量,那么这个指针变量也指向这个数组。同样函数名也具有上述相同的特性,即函数名表示函数控制块的首地址,函数控制块中包括函数入口地址等信息。如果用一个指针变量来标识函数控制块的首地址,则称这个指针变量为指向函数的指针变量,简称指向函数的指针、函数指针。函数指针声明形式是: 类型符(*标识符)(形式参数表); ?其中?标识符是被声明的“指向函数的指针变量”名; ?类型符给出函数指针变量所指向函数的类型信息; ?形式参数表给出函数指针变量所指向的函数的形式参数信息。例如 int (* f) ( float d , char c ) ; 声明指向“返回 int 类型值的函数”的函数指针变量 f , f 所指向的函数有两个形式参数: ?第一个参数是 float 类型, ?第二个参数是 char 类型。函数指针声明中用括号把星号“*”和“标识符”括起来是必须的,比如上述的(*f) 原因是由优先级造成的。引进函数指针概念不是凭空臆造的,它的作用在于?使用函数指针调用函数?实现其它程序设计语言中函数参数的功能本节先介绍利用函数指针调用函数,下一节介绍函数参数。可以把函数名赋值给一个函数指针变量,然后通过函数指针变量调用函数。形式是: 函数指针变量= 函数名; 这个赋值要求“函数指针的特性与函数名的特性一致”,这种一致性体现在?它们的返回类型相同; ?它们的参数个数相同; ?对应位置上,每个形式参数的类型相同。例 13-3 对给定整数数组排序,递增或递减按给定参数决定 bool ascending(int a, int b){ return a>b; } bool descending(int a, int b){ return a<b; } void swap(int * a , int * b ) { int temp; temp = * a; * a = * b; * b = temp; } void sort ( int a[ ], int n, char * flag) { bool (* ad) ( int,int ); / *函数指针*/ int pass,c ; if (flag=="ascending") / *根据排序方向给函数指针赋值具体函数*/ ad = ascending ; else ad = &descending ; / *函数名前加“&”和不加“&”意义相同*/ for ( pass=0; pass<n; pass++) / *冒泡排序*/ for ( c=0; c<n-1; c++) if ( (* ad)(a[c],a[c+1]) ) / *比较,此处使用函数指针*/ swap(&(a[c]),&(a[c+1]) ); / *交换*/ } 在本例题中, ?函数 sort 有三个参数, a是被排序的数组, n是数组长度, flag 是递增或递减标记; ?函数 swap 交换两个变量的值; ?函数 ascending 判断是否 a>b ; ?函数 descending 判断是否 a<b 。当调用 sort 时, sort 根据 flag 的值是否“ ascending ”, 决定按递增或递减排序,把函数名 ascending 或 descending 赋值给函数指针变量 ad 。通过调用 ad 所指向的函数,判断是否需要交换数组两个相邻成分。当需要交换时,调用函数 swap 。经过多次扫描,最终达到排序目的。函数 sort 使用了指向函数的指针调用函数 ascending 或 descending 使用函数指针要注意: ?给函数指针赋值时,右端只是一个函数名,不许带参数表 ad = ascending 是正确的,而 ad = ascending ( int,int ) 是错误的。?不能对函数指针变量进行任何运算。“ ad+n ”、“ ad++ ”、“ ad-- ”等是错误的。利用函数指针调用函数时,把“*”和函数名用括号括起来, 成(*函数名)( … ) 形式,是必须的。因为“() ”的优
ch13-三论函数 来自淘豆网m.daumloan.com转载请标明出处.