函数指针的几种用法

什么是函数指针?如何使用函数指针? 在C语言中,函数被视为存储在内存中的一段可执行代码,每个函数都有一个唯一的地址。函数指针是一个指针变量,它存储了一个函数的地址。你可以将函数指针用来调用函数,就像你可以使用普通指针来访问变量一样。是函数返回值的类型。是函数指针的名称。是函数的参数类型。返回值类型:指定了函数指针所指向的函数的返回值类型。:指定了指针变量的名称和表示这是一个函数指针的星号。:指定了函数指针所指向的函数的参数类型。函数指针的语法可能看起来有点复杂,但理解它的核心思想是关键。 阅读详情

什么是函数指针?

函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。

一个具体函数的名字,如果后面不跟调用符号(即括号),则该名字就是该函数的指针(注意:大部分情况下,可以这么认为,但这种说法并不很严格)。

函数指针的声明方法

// 定义函数指针pf

int (*pf)(constint&,const int&);                                                (1)

上面的pf就是一个函数指针,指向所有返回类型为int,并带有两个const int&参数的函数。注意*pf两边的括号是必须的,否则上面的定义就变成了:

int *pf(constint&, const int&);                                                   (2)

而这声明了一个函数pf,其返回类型为int *, 带有两个const int&参数。

用typedef定义函数指针类型

// 定义函数指针类型cmpFun

typedef int (*cmpFun)(constint&,const int&);                      (3)

这样,cmpFun就成了一种数据类型,可以用它来声明和定义形如(1)式中的pf那样的函数指针,比如:

cmpFun pf = 0;

cmpFun pf = someFunction;

举个例子来说明一下:

#include< iostream>

#include< string>

usingnamespace std;

// 定义函数指针pf

int (*pf)(constint&,const int&);

// 定义函数指针类型cmpFun

typedefint (*cmpFun)(constint&, const int&);

// 具体函数

int intCompare(constint& aInt,const int& bInt)

{

         if(aInt == bInt)return 0;

         if(aInt > bInt)

         {

                   return 1;

         }

         else

         {

                   return -1;

         }

}

int main(void)

{

         int aInt = 1;

         int bInt = 2;

         pf = intCompare;

         // pf = &stringCompare;            // 和上面一句是完全一样的

         //使用pf

         if(pf(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" <<"." << endl;

         }

         elseif(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt <<"." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt <<"." << endl;

         }

         cout << "------------------------" << endl;

         //用函数指针类型cmpFun声明并初始化一个函数指针pf2

         cmpFun pf2 = intCompare;

         //使用pf2

         if(pf2(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" <<"." << endl;

         }

         elseif(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt <<"." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt <<"." << endl;

         }

         return 0;

}

函数指针作为参数

函数指针可以作为一个函数的参数,如下两种办法可以做到这一点:

(a) int plusFun(int&,int&,int (constint&,const int&));

(b) int plusFun(int&,int(*)(constint&, const int&));

以上两个方式做到的是类似的事情:(a)中的plusFun函数的第三个参数就是一个函数指针, (b)中的第二个参数也是一个函数指针。下面我们分别定义前面声明的两个plusFun函数。

(a)中的plusFun定义如下:

//函数指针作为参数:错误的做法

//int plusFun(int& aInt, int& bInt, int paf(const int& cInt, const int& dInt))

//{

//

//       return aInt + bInt + paf(cInt, dInt);

//}

//函数指针作为参数:正确的做法

int plusFun(int& aInt,int& bInt,int paf(constint &,const int &))

{

         int cInt = 2;

         int dInt = 1;

         return aInt + bInt + paf(cInt, dInt);

}

调用plusFun的代码:

…

pf = intCompare;

…

// 函数指针作为参数

int aaInt = 3;

int bbInt = 4;

cout << plusFun(aaInt, bbInt, pf) << endl;

(b)中的plusFun定义如下:

//函数指针作为参数:错误的做法

//int plusFun(int& aInt, int(*paf2)(const int& bInt, const int& cInt))

//{

//       return aInt + paf2(bInt, cInt);

//}

//函数指针作为参数:正确的做法

int plusFun(int& aInt,int(*paf2)(constint&, const int&))

{

         int bInt = 1;

         int cInt = 2;

         return aInt + paf2(bInt, cInt);

}

调用plusFun的代码:

…

cmpFun pf2 = intCompare;

…

// 函数指针作为参数

int aaInt = 3;

cout << plusFun(aaInt, pf2) << endl;

函数指针作为返回值

一个函数的返回值可以是一个函数指针,这个声明形式写起来有点麻烦:

// 函数指针作为返回值

int (*retFunPointer(int))(constint&,const int&);

上面的声明的含义:

a)       retFunPointer是一个函数,该函数有一个int类型的参数;

b)       retFunPointer返回值是一个函数指针,它指向的是带有两个const int&类型参数,且返回类型为int的函数。

retFunPointer的定义:

// 函数指针为返回值

int (*retFunPointer(int aInt))(constint&,const int&)

{

         cout << aInt << endl;

         // pf已经在前面定义过了

         return pf;

}

调用代码示例:

// 函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针

cmpFun pf3 = retFunPointer(aaInt);

int result = pf3(aaInt, bbInt);

cout << result << endl;

包含上面所有情况的完整代码

#include< iostream>

#include< string>

usingnamespace std;

// 定义函数指针pf

int (*pf)(constint&,const int&);

// 定义函数指针类型cmpFun

typedefint (*cmpFun)(constint&, const int&);

// 函数指针作为参数

int plusFun(int&,int(constint&, const int&));

int plusFun(int&,int(*)(constint&, const int&));

// 函数指针作为返回值

int (*retFunPointer(int))(constint&,const int&);

// 具体函数

int intCompare(constint& aInt,const int& bInt)

{

         if(aInt == bInt)return 0;

         if(aInt > bInt)

         {

                   return 1;

         }

         else

         {

                   return -1;

         }

}

//函数指针作为参数:错误的做法

//int plusFun(int& aInt, int& bInt, int paf(const int& cInt, const int& dInt))

//{

//

//       return aInt + bInt + paf(cInt, dInt);

//}

//函数指针作为参数:正确的做法

int plusFun(int& aInt,int& bInt,int paf(constint &,const int &))

{

         int cInt = 2;

         int dInt = 1;

         return aInt + bInt + paf(cInt, dInt);

}

//函数指针作为参数:错误的做法

//int plusFun(int& aInt, int(*paf2)(const int& bInt, const int& cInt))

//{

//       return aInt + paf2(bInt, cInt);

//}

//函数指针作为参数:正确的做法

int plusFun(int& aInt,int(*paf2)(constint&, const int&))

{

         int bInt = 1;

         int cInt = 2;

         return aInt + paf2(bInt, cInt);

}

// 函数指针为返回值

int (*retFunPointer(int aInt))(constint&,const int&)

{

         cout << aInt << endl;

         // pf已经在前面定义过了

         return pf;

}

int main(void)

{

         int aInt = 1;

         int bInt = 2;

         pf = intCompare;

         // pf = &stringCompare;            // 和上面一句是完全一样的

         //使用pf

         if(pf(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" <<"." << endl;

         }

         elseif(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt <<"." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt <<"." << endl;

         }

         cout << "------------------------" << endl;

         //用函数指针类型cmpFun声明并初始化一个函数指针pf2

         cmpFun pf2 = intCompare;

         //使用pf2

         if(pf2(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" <<"." << endl;

         }

         elseif(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt <<"." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt <<"." << endl;

         }

         cout << "------------------------" << endl;

         //函数指针作为参数

         int aaInt = 3;

         int bbInt = 4;

         cout << plusFun(aaInt, bbInt, pf) << endl;

         cout << plusFun(aaInt, pf2) << endl;

         cout << "------------------------" << endl;

         //函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针

         cmpFun pf3 = retFunPointer(aaInt);

         int result = pf3(aaInt, bbInt);

         cout << result << endl;

         return 0;

}

【JESD79-5之】8 AC & DC 输入测量标准(AC & DC Input Measurement Levels) 时钟被驱动到DRAM,可以通过L/RDIMM模块的RCD来实现,也可以通过U/SODIMM模块的主机来实现(图184)。接收机DQS(脉冲)输入电压灵敏度测试提供了在没有码间干扰(ISI),抖动(Rj, Dj, DCD)和串扰噪声的情况下测试接收机对不同输入电压的灵敏度的方法。接收机数据输入电压灵敏度测试提供了在没有符号间干扰(ISI),抖动(Rj, Dj, DCD)和串扰噪声的情况下测试接收机对不同输入电压的灵敏度的方法。 阅读详情

相关推荐

CPU也能跑大模型?手把手教你用vLLM离线部署Qwen2.5-7B-Instruct(附性能优化技巧)

本文详细介绍了如何在CPU服务器上高效部署Qwen2.5-7B-Instruct模型,通过vLLM框架和一系列优化技巧实现离线推理。内容包括环境配置、模型加载优化、性能调优及生产环境部署方案,帮助开发者在资源有限的情况下也能运行大语言模型。

weixin_28691741的博客 489

函数指针的使用方法

一、C++函数指针 如果我们在程序中定义了一个函数: int Max(int x, int y) //定义Max函数 { if (x > y) return x; else return y; } 那么函数名Max就是调用这个函数的入口地址。就如同定义一个数组,这个数组名就是这个数组的首地址。 既然是地址,就可以使用一个指针来指向它。 对应于int Max(int x, int y),我们定义的函数指针如下: int(*p)(int, int); 与函数声明类似,int(

lzg_na的博客 1万+

官网下载stm32Fx固件库(标准外设)详细步骤

官网下载stm32f407固件库(标准外设)详细步骤

qq_52632983的博客 1万+

C语言--函数指针的用法总结

一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。 函数名代表函数的入口地址,这一点和数组一样。我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。如:假设有一个求两者较大的函数如下: int max(int x, int y); 当我们调用这个函数时可以这样: int c; c max(a,b); 这是通常调用方法,其实我们可以定义一个函数指针,通过指...

轮子工厂 2万+

BIDS数据存储格式介绍与dcm2bids安装与使用

BIDS格式&dcm2bids安装与使用

machinelearning_er的博客 7309

AUTOSAR内存篇 -内存驱动(Mem)

Mem驱动程序的task是基于底层内存设备技术的物理分段的低级内存访问。Mem驱动程序的API与内存设备技术无关,因此向存储器访问模块上层提供了与存储器设备无关的接口。所有高级功能(如跨段操作)都由内存访问模块处理,以尽可能降低Mem驱动器的复杂性和占用空间。Mem驱动API命名、类型定义和文件命名规则都遵循标准的AUTUSAR BSW模块实现。服务Mem_Init初始化Mem驱动的内部状态,并设置Mem驱动Job处理状态到MEM_JOB_OK。

IOT2017的博客 712

函数指针的用法以及用途详解

函数指针与装饰器模式

m0_62755690的博客 3681

【3GPP核心网】【5G】史上最全的5G协议规范总结

物理层信道定义:TS38.211(物理层信号的生成、调制,DMRS和额外DMRS,PRACH configuration index,Point A等介绍)传输信道和控制信道的数据处理:TS38.212(包括复用,信道编码,交织,DCI,DMRS端口号等)物理层控制过程:TS38.213(同步,上行功控,随机接入,UE上报和接收控制消息的过程,SSB等)物理层测量:TS38.215(UE和网络的测量控制,UE测量能力)频率、频点相关F R1:TS38.101-1。

风云说通信 3175

函数指针的使用

注意,尽管 shapes 数组中的元素类型为 shape_t *,但我们仍然可以调用每个元素的 draw 函数,因为 circle 和 rectangle 都是从 shape_t 派生出来的,它们都包含一个 draw 函数指针。接着,我们定义了一个函数指针数组 operations,其中的每个元素都是一个 operation_func_t 类型的函数指针,分别指向 add、subtract、multiply 和 divide 函数。这种数组可以用于实现一个分派表,根据输入参数的不同,动态地调用不同的函数。

123 1万+

[Unity3D]水族馆游戏教程四

文章目录0.接上篇1.速度控制器2.修改FishAI3.修改后的效果4.总结 0.接上篇 上一篇,实现了鱼AI的随机游动、自动转向,并且学习了如何分析调试过程中遇到的报错。 本篇将继续优化鱼AI。 1.速度控制器 上一篇虽然实现了鱼的随机游动,但是可以看到,鱼在转向的时候,会显得很突然。因此先要解决这个问题。 我们的思路是,让鱼在刚转向的时候,速度由慢到快,等到游动到快要到达目标点的时候,速度减慢...

延澈左的专栏 1037

NSX-T 4.1部署搭建

NSX-T4.1 部署搭建

weixin_58250887的博客 564

函数指针及几种用法

【代码】函数指针及几种用法。

zhongguoren_的博客 288

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言函数指针的几种用法【转】+gyy修改

C语言函数指针的几种用法---gyy修改后 程序如下: #include #include   /*--指针的应用都在主函数里,前面都是准备工作--*/   /*----------------------------------------------------------*/ /*------简单应用指针的前期准备------*/ /*-----------------

smallgyy的专栏 1680

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言函数指针的几种用法

程序如下: #include

qq_36501535的博客 444

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 停车场管理系统
下一篇: 最长公共子串问题的后缀数组解法
zhouxf_cn
博客等级 码龄14年 54粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值