指向函数的指针.doc_第1页
指向函数的指针.doc_第2页
指向函数的指针.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 定义和调用程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明:float max(float x,float y)return xy?x:y;float min(float x,float y)return xy?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.000000min=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), flo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论