首页 理论教育C语言程序设计基础:指向函数的指针变量

C语言程序设计基础:指向函数的指针变量

【摘要】:图8.1函数内存映射方式1.指向函数指针变量的定义C语言中可以定义指针变量来存储函数的首地址,并利用该指针变量对函数进行调用。指向函数的指针变量的真正作用是作为函数参数使用,使程序在功能的实现上具有更大的灵活性。指向函数的指针变量求最大值、最小值和两数之和。

一个函数在编译时,会被编译器分配一个地址,用函数名来表示,这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。

假设有一个函数func,则其内存映射方式如图8.1所示。

图8.1 函数内存映射方式

1.指向函数指针变量的定义

C语言中可以定义指针变量来存储函数的首地址,并利用该指针变量对函数进行调用。由于函数本身具有返回值类型、参数表等特征,所以在定义指向函数指针变量的时候必须表达出这些特征。指向函数指针变量定义的一般形式:

[存储类别符]数据类型名(*指针变量名)([形参类型1,形参类型2,…,形参类型n])

其中,存储类别符是函数指针变量本身的存储特性;数据类型则是被指针变量所指向的函数返回值类型,形参类型是指函数指针所指向的函数的形式参数数据,如果被指向函数有形参,则定义时带上形参类型;如果被指向函数没有形参,则定义也没有。

例如,设一函数的原型为:

void swap(int x,int y);

如果需要定义指向函数swap的指针变量,形式应该是:

void(*fp)(int x,int y);

对照上面swap函数的原型和指向函数的指针变量fp可以看出,在定义指向函数的指针变量时,指针变量名可以根据需要命名,但指针变量的数据类型和所带的参数表则与被指向的函数对应一致。

需要指出的是,定义指向函数的指针变量后,该指针变量不仅仅能指向某一个函数,而是可以指具有相同返回值类型和形参表的任意函数。例如,对于上面根据函数swap定义的指针变量fp而言,不仅能够指向函数swap,所有与swap返回值类型、参数表相同的函数都能够被该指针变量指向。

2.指向函数指针变量的赋值和引用

定义指向函数的指针变量后,就可以对其进行赋值。对指向函数的指针变量赋值,就是用被指向函数的名字对其赋值,其赋值的一般格式为:

函数指针=[&]函数名;其中,函数名后不能带括号和参数;函数名前的“&”符号是可选的。例如,对于前面定义的指针变量fp,可以将函数swap的名字直接赋值给该指针变量。赋值的形式为:

fp=swap;       //也可以使用fp=&swap;当一个指向函数的指针变量指向了一个函数后,通过对指针变量实施取指针运算就可以表示被指向的函数。利用函数指针来调用函数可以采用下面两种格式之一:

函数指针变量([实参1,实参2,…,实参n]);

(*函数指针变量)([实参1,实参2,…,实参n]);

例如,若指针变量fp已经指向了函数swap,那么swap函数的调用方法有:(www.chuimin.cn)

swap(10,20)//用函数名调用swap函数

(*fp)(10,20)//用指向swap函数的指针fp调用swap函数

fp(10,20)//用指向swap函数的指针变量调用swap函数

【例8.3】 指向函数的指针变量使用示例(求a+|b|)。

上面程序中,根据变量b的值来确定指针变量dp是指向函数add1还是指向函数add2,然后通过指针变量来调用对应的函数。这个示例是为了说明指向函数的指针变量如何赋值以及如何使用指向函数的指针变量来调用函数。指向函数的指针变量的真正作用是作为函数参数使用,使程序在功能的实现上具有更大的灵活性。

3.指向函数指针变量作函数的形式参数

当存在多个函数,它们的功能不同,但参数列表和返回值相同时,为了提高程序的运行效率,可以采用函数指针。这种情况下,函数指针通常作为函数的参数。

【例8.4】 指向函数的指针变量求最大值、最小值和两数之和。

【例8.5】 用函数指针数组来实现对一系列同类函数的调用。

程序一次运行的过程和结果如下: