【时时三省】(C语言基础)指向函数的指针
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
什么是函数的指针
如果在程序中定义了一个函数,在编译时会把函数的源代码转换为可执行代码并分配一段存储空间。这段内存空间有一个起始地址,也称为函数的入口地址。每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。
调用函数时,从函数名得到函数的起始地址,并执行函数代码。函数名就是函数的指针,它代表函数的起始地址。可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:
int ( *p ) ( int , int );
定义p是一个指向函数的指针变量,它可以指向函数类型为整型且有两个整型参数的函数。此时,指针变量p的类型用
int ( * ) ( int,int )表示。
用函数指针变量调用函数
如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量用函数指针变量调用函数来调用该函数。先通过一个简单的例子来回顾一下函数的调用情况。
例题1:
用函数求整数a和b中的大者。
解题思路:
定义一个函数max,实现求两个整数中的大者。在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。分别编程并作比较。
(1)通过函数名调用函数
运行结果:
(2)通过指针变量调用它所指向的函数
将程序改写为
运行结果同程序(1)
程序分析:
可以看到,程序( 1 )和( 2 )的max函数是相同的。不同的只是在main函数中调用max函数的方法。
程序( 2 )的第4行“int ( * p ) ( int,int );”用来定义p是一个指向函数的指针变量,最前面的int表示这个函数值(即函数返回的值)是整型的。最后面的括号中有两个int,表示这个函数有两个int型参数。注意*p两侧的括号不可省略,表示p先与*结合,是指针变量,然后再与后面的( )结合,( )表示是函数,即该指针变量不是指向一般的变量,而是指向函数。如果写成“int * p ( int,int );”,由于( )优先级高于*,它相当于“int * ( p ( int,int ) )”,就成了声明一个p函数了(这个函数的返回值是指向整型变量的指针)。
赋值语句“p = max”的作用是将函数max的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址,这样,p就是指向函数max的指针变量,此时p和max都指向函数的开头。调用* p就是调用max函数。请注意p是指向函数的指针变量,它只能指向函数的入口处而不可能指向函数中间的某一条指令处,因此不能用* ( p +1 )来表示函数的下一条指令。
在main函数中有一个赋值语句:
c = ( * p ) ( a , b );
它和
c = max ( a,b );
等价。这就是用指针实现函数的调用。以上用两种方法实现函数的调用,结果是一样的。