C语言指针---指向函数的指针
来源:互联网 发布:vscode great icons 编辑:程序博客网 时间:2024/04/29 10:31
C语言指针—指向函数的指针
1.什么是函数指针
在程序中定义了一个函数,在编译时,系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
一般形式: 类型名 (*指针变量名)(函数参数表列)
例如:
int (*p)(int int)
定义p是一个指向函数的指针变量,它可以指向函数的类型为整型且与两个整型参数的函数。p的类型用int(*)(int,int)表示。
2.函数指针变量的应用
(1)用函数求整数a和b的大者
#include<stdio.h>int max(int x,int y){ int z; if(x>y) { z=x; } else { z=y; } return (z);}int main(){ int (*p)(int ,int); //定义指向函数的指针变量 int a,b,c; p=max; //使p指向max函数 printf("please enter a and b:\n"); scanf("%d,%d",&a,&b); c=(*p)(a,b); //通过指针变量调用max函数 printf("a=%d\nb=%d\nmax=%d\n",a,b,c); return 0;}
程序分析:
- “int()p(int int);”用来定义一个指向函数的指针变量。注意(*p)两侧的括号不能省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示函数,即该指针变量不是指向一般的变量,而是指向函数。
如果写成了“int p(int int)”,由于()优先级高于*,它相当于“int*(p(int int)),就成为声明一个p函数了 - 赋值语句“p=max”的作用是将函数的入口地址赋给指针变量p,p就是指向函数max的地址。即c=(*p)(a,b);和c=max(a,b)等价。
(2)利用一个函数实现多个函数的功能
问题:有两个整数a和b用户输入1,2或3。如输入1,,程序就给出a和b中的大者;如输入2,程序就给出两者中的小者;如输入3,程序就给出a和b的和。
#include<stdio.h>int main(){ int fun(int x,int y,int (*p)(int,int)); int max(int,int); int min(int,int); int add(int,int); int a=34,b=-21,n; printf("please choose 1,2or3: "); scanf("%d",&n); if(n==1) { fun(a,b,max); } if(n==2) { fun(a,b,min); } if(n==3) { fun(a,b,add); } return 0;}int fun(int x,int y,int(*p)(int,int)) //定义fun函数{ int result; result=(*p)(x,y); printf("%d\n",result); //输出结果}int max(int x,int y) //定义max函数{ int z; if(x>y) { z=x; } else { z=y; } printf("max="); return (z); //输出两者中的大值}int min(int x,int y) //定义min 函数{ int z; if(x>y) { z=y; } else { z=x; } printf("min="); return(z); //输出两者中的小值}int add(int x,int y) //定义add函数{ int z; z=x+y; printf("min="); return(z); //返回值是两数中之和}
运行结果:
- 若输入1
please choose 1,2or3: 1
max=34 - 若输入2
please choose 1,2or3: 2
min=-21 - 若输入3
please choose 1,2or3: 3
add=13
程序分析:
在定义fun函数时函数首部用“int(*p)(int,int)”声明形参p是指向函数的指针。调用fun函数时,函数名min,max,add,作为实参将其入口地址传送给fun函数中的形参p。
3.指针变量使用说明
(1)定义指针变量只能指向定义时指向的函数。如前面的“int (*p)(int ,int );“表示指针变量p只能指向返回值为整型且有两个整型参数的函数。然后把那个函数名赋给函数名即可。
(2)如果要用指针点调用函数,必须使指针变量指向该函数。如:
p=max;
这就把max函数的地址赋给指针变量p.
(3)再给函数指针变量赋值时,只需给出函数名而不必给出参数。如:
p=max;
因为只是赋地址,若“p=max(a,b)”为函数的调用,故错误。
(4)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),
在(*p)之后的括号中根据需要写上实参。例如:
c=(*p)(a,b);
(5)对指向函数的指针不能进行算术运算,如:p+n,p++。
4.指向函数的指针应用条件:
- 通常通过编写一个通用的函数来实现各种专用的功能。例如第二个程序中通过输入一个数字,然后通过输入不同的值调用不同的函数,实现不同的功能。当然也可以用if语句或switch语句进行判断,调用不同的函数。但是用指针变量显得更专业。
- C语言指针---指向函数的指针
- 11.26C语言----指针函数/指向指针的指针
- c语言学习,指针函数、函数指针、指针的指针、指向指针数组的指针
- c语言学习,指针函数、函数指针、指针的指针、指向指针数组的指针
- C语言 指向函数的指针
- 指向函数的指针 - C语言
- 11.13 C语言----指向函数的指针
- C语言指向函数的指针
- C语言指向函数的指针
- C语言 指向函数的指针
- C语言指向函数的指针
- C语言--指向函数的指针
- c语言指针,指向指针的指针
- C语言函数指针(指向函数的指针)
- 105 C语言函数指针(指向函数的指针)
- C语言中的指针(指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针)
- C语言指针学习:指向函数的指针
- c语言:数组指针,指针数组,函数指针,函数指针数组,指向函数指针数组的指针
- libsvm-mat在MATLAB平台下的安装
- 亲测鸡汤!!stm32用于进入停止模式的中断和用于产生唤醒的中断,后者的抢占优先级一定要高,否则无法唤醒!
- TabLayout+Fragment+ViewPager联合使用
- Table '.\tablename' is marked as crashed and should be repaired
- android中textview字数过长解决方法
- C语言指针---指向函数的指针
- RESTful API 设计指南
- C++11新特性move
- TextView相关
- Flex 布局
- swift表情emoji的转换
- linux shell 管道命令(pipe)使用及与shell重定向区别
- java中float和double的区别
- jedis调用redis之分页