`

指向函数的指针

阅读更多
1 定义和调用
程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明:
float max(float x,float y)
{
return x>y?x:y;
}
float min(float x,float y)
{
return x<y?x:y;
}
main()
{
float a=1,b=2, c;
float (*p)(float x, float y);
p=max;
c=(*p)(a,b); /*等效于 max(a,b)*/
printf("\nmax=%f",c);
p=min;
c=(*p)(a,b); /*等效于min(a,b)*/
printf("\nmin=%f",c);
}
程序运行的结果为:
max=2.000000
min=1.000000

说明:
(1)语句float (*p)(float x, float y);定义了一个指向函数的指针变量。函数的格式是:返回值为float型,形式参数列表是(float x, float y)。p定义后,可以指向任何满足该格式的函数
(2)定义指向函数的指针变量的格式为:
(3)数据类型(*指针变量名称)(形式参数列表);
(4)其中数据类型是函数返回值的类型,形式参数列表是函数的形式参数列表。
(5)形式参数列表中,参数名称可以省略。比如,float (*p)(float x, float y);可以写为:
(6)float (*p)(float, float);
(7)注意指针变量名称两边的括号不能省略
(8)语句p=max;将max函数的首地址值赋给指针变量p,也就是使p指向函数max。C语言中,函数名称代表函数的首地址。
(9)第一个c=(*p)(a,b);语句:由于p指向了max函数的首地址,(*p)(a,b)完全等效于max(a,b)。函数返回2.0。注意*p两边的括号不能省略。
(10)语句p=min; 将min函数的首地址值赋给指针变量p。p是一个变量,p的值实际上是一个内存地址值,可以指向max,也可以指向min,但指向函数的格式必须与p的定义相符合。
(11)第二个c=(*p)(a,b);语句:由于p指向了min函数的首地址,(*p)(a,b)完全等效于min(a,b)。函数返回1.0。
(12)将函数首地址赋给指针变量时,直接写函数名称即可,不用写括号和函数参数。
(13)利用指针变量调用函数时,要写明函数的实际参数。

提示:定义一个指向函数的指针变量时,一定要使用括号。比较下面的两个定义:
float (*p1)(int x, long y);
float *p2(int x, long y);
第一个语句定义了一个指向函数的指针变量p1;第二个语句声明了一个函数p2,p2的形式参数为(int x, long y),返回值为一个float型的指针
2 指向函数的指针作为函数参数
有时候,许多函数功能不同,但它们的返回值和形式参数列表都相同。这种情况下,可以构造一个通用的函数,把函数的指针作为函数参数,这样有利于进行程序的模块化设计。比如下面的例子中,我们把对2个float型数进行加、减、乘、除操作的4个函数归纳成一个数学操作函数MathFunc。这样,在调用MathFunc函数时,只要将具体函数名称作为函数实际参数,MathFunc就会自动调用相应的加、减、乘、除函数,并计算出结果。下面是程序的代码:
float Plus(float f1, float f2);
float Minus(float f1, float f2);
float Multiply(float f1, float f2);
float Divide(float f1, float f2);
float MathFunc(float (*p)(float, float), float para1,float para2);
main()
{
float a=1.5, b=2.5;
printf("\na+b=%f", MathFunc(Plus, a,b));
printf("\na-b=%f", MathFunc(Minus, a,b));
printf("\na*b=%f", MathFunc(Multiply, a,b));
printf("\na/b=%f", MathFunc(Divide, a,b));
}

float Plus(float f1, float f2)
{
return f1+f2;
}

float Minus(float f1, float f2)
{
return f1-f2;
}

float Multiply(float f1, float f2)
{
return f1*f2;
}

float Divide(float f1, float f2)
{
return f1/f2;
}

float MathFunc(float (*p)(float, float), float para1,float para2)
{
return (*p)( para1, para2);//此处(*p)和p的效果一样,原因是常的函数名字fun就是代
//表一个指针,函数调用时严格的完整格式是(*fun)(x);但是C语言支持函数调用时的缩写
//即省去指着标示,可写为:
//fun(x);
//同样,一个指向函数的指针p,也可以按照省略形式书写。你要想追求代码清晰可以采用完//全书写。

}

程序运行的结果为:
a+b=4.000000
a-b=-1.000000
a*b=3.750000
a/b=0.600000

例 8-10 利用指向函数的指针,求如下函数在一个区段内的最小值。
本题可以利用指向函数的指针。虽然所给的函数互不相同,但其在一定区间内求最小值的算法都是通用的。因此,可以写一个通用的函数float GetMin(float (*p)(float), float fPos1,float fPos2),用于计算不同函数的最小值。该函数的第一个参数p是一个指向函数的指针,p指向包含一个float型参数的函数。
对应于题目的要求,分别写三个数学函数。
在主函数中,调用GetMin时,第一个参数分别使用上述数学函数的名称,后两个参数传入区间值。这样,调用三次GetMin即可以求出三个函数在给定区间的最小值。
#include "math.h"
float f1(float x)
{
return x*x+2*x+1; /*f1的表达式*/
}
float f2(float x)
{
return 2*sin(x); /*f2的表达式*/
}
float f3(float x)
{
return 2*x+1; /*f3的表达式*/
}
/*p为指向函数的指针,fPos1和fPos2为左右区间的值*/
float GetMin(float (*p)(float), float fPos1,float fPos2)
{
float f,t, fMin, fStep=0.01; /* fStep为步长值*/

/*在fPos1至fPos2的区间内,以fStep为步长,依次比较最小f值*/
fMin=(*p)(fPos1);
for(f=fPos1;f<=fPos2;f+=fStep)
{
t=(*p)(f);
if(t<fMin)
fMin=t;
}
/*返回求出的最小值*/
return fMin;
}
main()
{
/*直接计算并输出结果*/
printf("\nMin value of f1: %f",GetMin(f1,-1,1));
printf("\nMin value of f2: %f",GetMin(f2,1,3));
printf("\nMin value of f3: %f",GetMin(f3,-1,1));
}
程序运行的结果为:
Min value of f1: 0.000000
Min value of f2: 0.282244
Min value of f3: -1.000000
主函数main调用GetMin函数时,传入了函数名称和区间值。GetMin函数在计算函数最小值时,根据传入的函数指针p调用相应的函数。
灵活使用指向函数的指针可以提高程序的扩充性。比如本题,如果要增加条件,计算一个f4(x)=2*logx+1在(0,5)内的最小值,那么我们只需要增加一个f4函数的定义,然后在main函数中就可以直接进行计算GetMin(f4,0,5),GetMin函数不用进行任何修改。
分享到:
评论

相关推荐

    指向函数的指针运用

    压缩包中的`指向函数的指针.cpp`文件应该包含了上述所有代码的实现,而`指向函数的指针.exe`则是编译后的可执行程序,运行这个程序将演示如何通过函数指针调用和比较两个积分函数。 总结来说,这个示例展示了C++中...

    函数指针就是指向函数的指针;类成员方法指针,类具有类域操作符

    在C++编程中,函数指针是一个非常重要的概念,它允许我们存储函数的地址并像普通指针一样对其进行操作。函数指针可以被用来作为参数传递给其他函数,或者存储在一个变量中,以便稍后调用。这为程序设计提供了很大的...

    C/C++ 函数指针的意义,函数指针的用法

    ### C/C++ 函数指针的意义与应用 在C/C++编程中,函数指针是一种高级特性,它允许程序员处理函数的方式如同处理变量一般灵活。理解函数指针的意义及其用法,对于提升代码的可扩展性和灵活性至关重要。 #### 1. ...

    c++中指向函数的指针

    在C++中,指向函数的指针是一种强大的工具,它允许我们存储函数的地址并以指针的形式调用它们。这种技术在某些情况下非常有用,比如动态选择执行哪个函数、作为参数传递给其他函数或者作为函数的返回值。下面我们将...

    函数指针详解 word文档讲解详细 很细

    本文详细介绍了函数指针的三种主要用法:指向普通函数的指针、函数指针数组以及指向函数指针数组的指针。同时,还简单提及了在C++中函数指针与类成员的关联。 1. 指向普通函数的指针: 在C++中,函数指针的定义...

    函数指针详解[文].pdf

    本文详细介绍了函数指针在C++中的应用和使用,包括基本概念、函数指针数组以及指向函数指针数组的指针,并简要提及了函数指针与类成员的关联。 1. **基本的函数指针** 在C++中,函数可以被视为一等公民,它们可以...

    指针函数和函数指针变量

    在C语言中,指针和函数是两个非常重要的概念,而将它们结合在一起,就产生了指针函数和函数指针变量。这两个概念是C语言高级特性的体现,它们在编程中有着广泛的应用,如回调函数、动态加载库、内存管理等。 首先,...

    函数指针和函数对象

    函数指针是指向函数的指针变量,可以指向全局函数或类成员函数。函数指针的类型是指针类型,例如`typedef void (*fp)(int);`,其中`fp`是函数指针的名称,`(*fp)`表示函数指针指向的函数,`(int)`表示函数的参数类型...

    指向指针的指针.docx

    函数指针可以被用来存储函数的地址,而指向函数指针的指针则可以用来动态地改变程序的行为。例如,在提供的代码示例中,`p`就是一个函数指针,它指向`add`函数,可以通过改变`p`指向的函数来改变程序的行为。 ### 3...

    C语言指针函数和函数指针详细介绍.

    函数指针是指向函数的指针,包含了函数的地址,可以通过它来调用函数。其声明格式为:类型说明符 (*函数名)(参数)。例如: ```c void (*fptr)(); ``` 函数指针的声明笔削和它指向函数的声明保持一致。如果没有圆括号...

    函数指针和指针函数的区别

    2. **类型**:函数指针是一种特殊的指针类型,它指向函数而不是数据。指针函数是一个普通的函数,只是返回值是另一个类型的指针。 3. **操作**:函数指针可以被传递给其他函数作为参数,也可以作为其他函数的返回值...

    一般函数指针和类的成员函数指针

    在这个例子中,`pFun`是一个函数指针类型,它可以指向任何接受两个整型参数并返回一个整型值的函数。接下来,可以通过将函数的地址赋值给该函数指针来使用它: ```cpp pFun fun = Max; int result = (*fun)(3, 4); ...

    详解函数指针和指针函数

    函数指针的定义包含了函数的返回类型和参数列表,以确保与所指向的函数匹配。 1. **函数指针定义**:函数指针的声明语法是`函数类型 (*指针变量名)(形参列表)`。这里的`函数类型`指函数的返回类型,`*指针变量名`是...

    C++ 一般(普通)函数指针、类成员函数指针,用法区别,以及强制转换

    例如,如果你有一个接受两个整数并返回整数的函数`add(int a, int b)`,你可以定义一个指向它的函数指针如下: ```cpp int (*add_ptr)(int, int); ``` 然后你可以通过`= &add`将函数地址赋值给这个指针,并通过`*...

    指针进阶之函数指针和函数指针数组

    函数指针是指向函数的指针,它可以用来存放函数的地址,并且可以通过函数指针来调用函数。函数指针的定义方式与数组指针类似,但函数指针的类型是指向函数的类型。 2. 回忆函数 回忆一下我们之前说的函数,写一个...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    ### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...

    函数指针和指针函数的理解

    **函数指针**指的是指向函数的指针变量,它存储的是函数的入口地址。当我们想要在运行时动态地选择调用哪个函数时,函数指针就显得非常有用。例如,我们可以将函数指针作为参数传递给其他函数,这样可以在运行时决定...

    C++对象和指针的引用

    &lt;类型说明符&gt;*&lt;指向函数指针名&gt;(&lt;参数表&gt;) 关于给指向函数的指针赋值的格式如下: &lt;指向函数的指针名&gt;=&lt;函数名&gt; 关于在程序中,使用指向函数的指针调用函数的格式如下: (*&lt;指向函数的指针名&gt;)(&lt;实参表&gt;) ...

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    ### 函数指针和指针函数的区分及应用 #### 函数指针的理解与使用 **函数指针**是一种特殊的指针类型,它可以用来存储函数的地址,进而通过该指针来调用函数。理解函数指针的关键在于认识到函数也是一种具有特定...

Global site tag (gtag.js) - Google Analytics