如何定义指向函数的指针?

绿水悠悠 2019-02-02 23:10:00
好评回答
(一)用函数指针变量调用函数  可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:1#include2#include34intmain()5{6intmax(int,int);7int(*p)(int,int);8inta,b,c;9p=max;10scanf("%d,%d",&a,&b);11c=(*p)(a,b);12printf("a=%d,b=%d,max=%d ",a,b,c);13return0;14}1516intmax(intx,inty)17{18intz;19if(x>y)z=x;20elsez=y;21return(z);22}  main函数中的"c=max(a,b);"包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。  第7行:int(*p)(int,int);用来定义p是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意*p两侧的括号不可省略,表示p先与*结合,是指针变量,然后再与后面的()结合,表示此指针变量指向函数,这个函数值(即函数的返回值)是整形的。如果写成int*p(int,int),由于()的优先级高于*,它就成了声明一个函数P(这个函数的返回值是指向整形变量的指针)。  赋值语句p=max;作用是将函数max的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时p就是指向函数max的指针变量,此时p和max都指向函数开头,调用*p就是调用max函数。但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用*(p+1)来表示指向下一条指令。  注意:  (1)指向函数的指针变量的一般定义形式为:  数据类型(*指针变量名)(函数参数列表)  这里数据类型就是函数返回值的类型  (2)int(*p)(int,int);它只是定义一个指向函数的指针变量p,它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。  (3)p=max;在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给p,而不涉及实参和形参的结合问题,不能写成p=max(a,b);  (4)c=(*p)(a,b)在函数调用时,只需将(*p)代替函数名即可,后面实参依旧。  (5)对于指向函数的指针变量,像p++,p+n.....是无意义的。  (二)用指向函数的指针作为函数参数  函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。  函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。  voidsub(int(*x1)(int),int(*x2)(int,int)){  inta,b,i,j;  a=(*x1)(i); /*调用f1函数*/  b=(*x2)(i)(j);/*调用f2函数*/}  如果实参为两个函数名f1和f2.在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。i和j是函数f1和f2所要的参数。函数sub的形参x1、x2(指针变量)在函数sub未被调用时并不占用内存单元,也不指向任何函数。在sub被调用时,把实参函数f1和f2的入口地址传给形式指针变量x1和x2.  既然在sub函数中要调用f1和f2函数,为什么不直接调用f1和f2而要用函数指针变量呢?确实,如果只是用到f1和f2函数,完全可以在sub函数中直接调用f1和f2,而不必设指针变量x1和x2。但是,如果在每次调用sub时,调用的函数不是固定的,下次是f3和f4,再是f5和f6...这时用指针变量就比较方便了。
花太香 2022-01-19 17:00:28

相关推荐

以避不祥的意思

以避不祥的意思是是希望通过什么手段避免有一些不详的事情发生或隐瞒一些不详的事情。不祥,指不吉利;不善之事或不善之人;死的讳称。语出《易·困》:“入于其宫,不见其妻,不祥也。”...
详情>
提问时间:2020-05-28

尼康如何测光

可以打开相机在自定义设定菜单“f4”指定AE-L/AF-L键为“AF-ON”并设定对焦模式为AF-C,指定“c1”为“AE-L”。这样测光就完全交给快门键,无论是构图前还是构...
详情>
提问时间:2020-05-07

线上上课的利与弊

线上上课的利处是利用网络环境进行教学活动,改变了传统的以教师为中心的教育模式,简单方便。弊处是线上上课对学员的自制力要求较高,如果用户没有规划好时间,上课断断续续,会直接影响...
详情>
提问时间:2020-08-04

皮肤怎么抗氧化

食用抗氧化食品。多吃天然的尤其是新鲜的抗氧化食品,含有维生素A、B、C、E的是最佳选择。像马铃薯、绿茶、柑橘、花椰菜、牛奶、鱼、小麦、樱桃、草莓、西瓜、西红柿等,都是价廉物美...
详情>
提问时间:2020-08-10

苹果手机设置信任在哪里设置

1.在iPhone手机上打开“设置”,在弹出来的页面中点击“通用”。2.在通用中点击“设备管理”选项,选择要信任的企业级APP。3.点击信任相应的应用,选择“信任”即可。当我...
详情>
提问时间:2020-06-02

湖库钓鱼怎样选钓位

在大水面野钓,选择钓位时要首选大内湾,方便进出,水库四周大多丘陵地形,所谓大内湾一般是三面有坎,甚至高坎,一面临水,内湾半径至少50米以上,特别避风的地方另当别论。湾内相对风...
详情>
提问时间:2020-05-28

索尼相机充电几个小时

索尼相机根据电池的型号不同,充电时间也有差异,一般4到6小时都可以充满。索尼照相机走的是高端时尚前卫路线,CCD技术先进,便携中的高像素,防抖,自动捕捉头像,而且索尼照相机还...
详情>
提问时间:2020-04-27

老板对员工感恩的话语

1、衷心地感谢全体员工竭忠尽智,恪守职位,践行了“满意在公司,敬业在岗位”的入职誓言,创造了一个又一个佳绩!只有员工的满意,才会带来满意的客户,才能开创公司的多赢局面。2、在...
详情>
提问时间:2020-06-30

中考宣言激励人心话语

中考宣言激励人心话语:1、中考是一个实现人生的省力杠杆,此时是你撬动它的最佳时机,并且以后你的人生会呈弧线上升。2、生命之中最快乐的是拼搏,而非成功,生命之中最痛苦的是懒散,...
详情>
提问时间:2020-08-04

前线医护人员致敬词

疫情渐起正新年,多少回家梦不圆。万里重山遮望眼,一屏牵挂两头煎。临危受命战江城,不负国人唱大风。高冠病毒虽可恶,医德彰显为苍生。疫情无奈到封城,为保家国切莫惊。四海同胞皆肯愿...
详情>
提问时间:2020-07-13

iso值是什么

感光度,又称为ISO值,是衡量底片对于光的灵敏程度,由敏感度测量学及测量数个数值来决定,最近已经被国际标准化组织标准化。对于较不敏感的底片,需要曝光更长的时间以达到跟较来敏感...
详情>
提问时间:2020-05-14

带翎羽的诗句

1、鸦翎羽箭山桑弓,仰天射落衔芦鸿。2、懒学风云戢翎羽。绿酒清琴好养生,出将入相无心取。3、白丝翎羽丹砂顶,晓度秋烟出翠微。4、广寒会可升,试为刷翎羽。5、翎羽如今从放长,犹...
详情>
提问时间:2020-05-28

素饺子馅 做法

素饺子馅的做法:1、把西葫芦切成丝并在容器中撒入少许盐,搁置一会去一去西葫芦自身的水,挤干备用。2、把鸡蛋打入容器中打散、葱花切碎、虾皮若干。3、起油锅,放入鸡蛋、虾皮和葱花...
详情>
提问时间:2020-06-02

动物细胞培养的特点

动物细胞培养的特点是细胞贴壁,有丝分裂,接触抑制。动物细胞培养就是从动物机体中取出相关的组织,将它分散成单个细胞(使用胰蛋白酶或胶原蛋白酶)然后,放在适宜的培养基中,让这些细...
详情>
提问时间:2020-05-26