首页

文章

如何定义一个指向任何函数的函数指针

发布网友 发布时间:2022-04-19 14:29

我来回答

1个回答

热心网友 时间:2023-10-25 07:54

 (一) 用函数指针变量调用函数  可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:1 #include 2 #include 3 4 int main() 5 { 6 int max(int,int); 7 int (*p)(int,int); 8 int a,b,c; 9 p = max;10 scanf("%d,%d",&a,&b);11 c = (*p)(a,b);12 printf("a=%d,b=%d,max=%d ",a,b,c);13 return 0;14 }15 16 int max(int x,int y)17 {18 int z;19 if(x>y) z = x;20 else z = y;21 return(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.....是无意义的。  (二) 用指向函数的指针作为函数参数  函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。  函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。  void sub ( int ( *x1) (int), int (*x2) (int,int) )    {      int a,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...这时用指针变量就比较方便了。
李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 唐古拉山海拔唐古拉山海拔是多少 怎么看待取消跳广场舞的人的退休金 如何选购新鲜的蓝田水柿? 恭城水柿柿树作用 创维洗衣机使用教程 创维全自动洗衣机怎么使用 自动开门器 狗羊属相婚姻相配吗 3岁的小孩不会说话怎么办 如何使用函数指针指向几个函数 函数指针怎么理解*******调用 怎样用函数指针做参数? 函数指针? 如何通过函数指针调用函数 c语言函数指针怎么用啊?尤其是main函数 如何定义一个函数指针? 请问这个函数指针怎么理解? 函数指针(指向函数的指针) 如何使用? 它和回调... c++的函数指针是怎么用的呀? 函数指针怎么用?? 函数指针如何定义 如何定义指向函数的指针? 函数指针怎么调用 C语言函数指针怎么用? SPACE键是什么? 发早上好会占对方很大内存吗?? 怎样调皮的说早上好 韩语早上好怎么说 网上说微信发早上好图片会占对方大内存吗? 函数指针是什么?_? 通易付打电话问还用吗,不用的话给注销是真的假的? 通易付plus如何注销 通易付plus里的个人信息怎么注销? 通易付实名认证中为什么要认证信用卡,但信用卡却... 通易付plus骗局通易付为什么刷卡扣了199的服务费?... 通易付pos机注册需要上传身份证和银行卡吗?提供这... 通易付安全吗? 通易付被装机人盗刷不用了会被扣钱吗? 通易付POS机是支付宝免押金领取吗? 通易付plus pos机是正规的吗? 通易付不用了要不要收年费 通易付刷支付宝匹配商户失败 通易付账号关闭怎么回事?不让提现了! 不是所有的通易付都是骗子,都被不良商家搞坏了? 通易付pos机,刚买回来,还没用,因为好奇拆开了,... 通易付刷卡显示付款成功,收钱卡是注销了的银行卡,... 通易付身份实名验证之后,激活金额太大,不激活了。... space键在哪? 花呗借款怎么查账单
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com