C语言中指向函数的指针(我见过的讲的最清晰的文章)
来源:互联网 发布:三中三复式计算器软件 编辑:程序博客网 时间:2024/06/05 22:53
http://wenku.baidu.com/view/7e566448cf84b9d528ea7a57.html
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);可以写为: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);
}
程序运行的结果为:
a+b=4.000000
a-b=-1.000000
a*b=3.750000
a/b=0.600000
- C语言中指向函数的指针(我见过的讲的最清晰的文章)
- C语言中指向函数的指针
- C语言中指向函数的指针
- C语言中指向函数的指针
- C语言中指向指针的指针
- C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- [转]C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- C/C++语言中指向函数的指针
- 函数参数中指向指针的指针
- 详解c中指向指针的指针
- 我见过最清晰的--理解梯度,散度,旋度
- 回调函数---我见过讲过最详细的
- 在ARM+LINUX上使用pppd拔号上网(GPRS)流程
- Big-Endian和Little-Endian的判断,以及我写的C语言测试程序
- [转贴]WindowsXP下搭建Git服务器
- [转]C++著名程序库的比较和学习经验
- wget 1.13.4 移植到嵌入式ARM上的过程
- C语言中指向函数的指针(我见过的讲的最清晰的文章)
- 摆脱穷人思维,成就财富梦想
- JAVA传给方法的参数详解
- Java读写文件(字符流)简单例子
- JAVA中获取日期和时间(使用Calendar类)
- Android的intent
- BZOJ 1076([SCOI2008]奖励关-期望dp-从后向前)
- Activtiy的生命周期(android)
- Activity的其它相关知识