C++中的函数指针的一些总结

C++中的函数指针 这样,使用MyFunctionPointer就可以声明一个指向函数的指针,使得代码更加简洁易读。在C++中,函数指针是一个指向函数的指针,可以用来调用函数。 阅读详情

1、函数指针的引出

      假设我们需要写个函数

sort( start, end, compare );
对start 和end 之间的数组元素进行排序compare 定义了比较数组中两个字符串的比较操作。如果我们需要比较的数组是string类型,那么排序方式,也许是按照字典序列,也许是串长度,也许是出现频率,那么怎么方便的进行比较呢?

        众所周知,C语言的一大精髓就是指针,那么对此,我们同样可以引入指针来解决。这里的解决方案就是函数指针:讲第三个参数compare 设为函数指针并由它指定要使用的比较函数。从而方便的进行各种比较。

2、函数指针的使用

1)声明

     怎么声明一个函数指针呢?

int (*pf)( const string &, const string & ); // ok: 正确
       如上,声明了一个函数指针,注意的是,解引用操作符* 应与返回类型关联所以在这种情况下是与类型名int 关联而不是pf 要想让解引用操作符与pf 关联,所以括号是必需的,而不能声明为:
int *pf( const string &, const string & );

2)初始化、赋值和调用

      a. 函数指针可以用0 来初始化或赋值以表示该指针不指向任何函数。

      b.直接去想要调用的函数名,如add,注意,这里没有括号。为什么呢?我们知道不带下标操作符的数组名会被解释成指向首元素的指针当一个函数名没有被调用操作符修饰时会被解释成指向该类型函数的指针,例如表达式    

lexicoCompare;
被解释成类型
int (*)( const string &, const string & );
的指针,这里,lexicoCompare定义如下:

#include <string>
int lexicoCompare( const string &s1, const string &s2 ) {
return s1.compare(s2);
}
     c.将取地址操作符作用在函数名上也能产生指向该函数类型的指针因此lexicoCompare和&lexioCompare 类型相同
     对于初始化和赋值的示例如下:

int (*pfi)( const string &, const string & ) = lexicoCompare;//初始化
pfi = lexicoCompare;//赋值
      看到这个赋值,楼主想到2个地方,一个是在严蔚敏版数据结构的源代码中,BFS和DFS中的visit函数,都是定义为的函数指针,当时的定义为:

void(*VisitFunc)(char* v); /* 函数变量(全局量) */
      传参时如本例提出,将参数作为函数指针传入

void DFSTraverse(ALGraph G,void(*Visit)(char*))
      另外一个,是在flex的ActionScrip中的addEnentListen(),如

addEventListener(Event.CLOSE, closeHandler);
        closeHandler则是作为函数指针传入,虽然在as入门书上讲是引用,不过引用,不就是弱化版指针呢么?(其实对于引用,C++Primer有一句简要的概括: 引用是没有指针语法的指针。比如调用时指针用->,引用用点操作符)。
3、问题的解决

       下面用函数指针解决开始提出的sort问题,funcP.h代码如下:

#include <string>
#include <iostream>
using namespace std;

typedef int ( *PFI2S )( const string &, const string & );

int lexicoCompare( const string &s1, const string &s2 )
{
	return s1.compare(s2);
}

void sort( string *s1, string *s2,PFI2S compare = lexicoCompare )
{
	// 递归的停止条件
	if ( s1 < s2 ) 
	{
		string elem = *s1;
		string *low = s1;
		string *high = s2 + 1;
		for (;;) 
		{
			while ( compare( *++low, elem ) < 0 && low < s2) ;
			while ( compare( elem, *--high ) < 0 && high > s1) ;
			if ( low < high )
				low->swap(*high);
			else break;
		} // end, for(;;)
		s1->swap(*high);
		sort( s1, high - 1, compare );
		sort( high + 1, s2, compare );
	} // end, if ( s1 < s2 )
}
main.cpp如下:

#include "funcP.h"
string as[10] = { "a", "light", "drizzle", "was", "falling",
                   "when", "they", "left", "the", "museum" };
int main() 
{
	// 调用 sort(), 使用缺省实参作比较操作
	sort( as, as + sizeof(as)/sizeof(as[0]) - 1 );
	// 显示排序之后的数组的结果
	for ( int i = 0; i < sizeof(as)/sizeof(as[0]); ++i )
		cout << as[ i ].c_str() << endl;
	return 0;
}
     程序使用了typedef使程序可读性更强,并提供了默认参数(关于默认参数这种偷懒的东东,理解为初始化对话框内容这样,以后可改,只是提供初值。只是这样的初始化,很符合常规思维,理念上更可取)
4、一些注意的问题

      在指向函数类型的指针之间不存在隐式类型转。也就是,只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型完全匹配时初始化和赋值才是正确的如果不匹配则将产生编译错误消息。在灵活性上,更注重了安全性,高级货啊!

      

         关于函数指针,还可以参考http://ly4cn.cnblogs.com/archive/2005/12/17/299007.html这个简单明了,很清晰易懂。

http://wenku.baidu.com/view/000364fcf705cc17552709d0.html就比较教科书化了。另外有很好的一个总结,http://bbs.chinaunix.net/thread-993238-1-1.html,像这个2楼提到,linux下的一个system table的调用,其实也是函数指针。当时做linux内核实验的时候发现系统调用,其实也是以函数指针的形式传递,怎么讲呢,这样的传递,重要的是一种思想,而不是语言的实现,或者实现的名字。提到这个,又扯一下,看《疯狂的程序员》发现里面一个很有道理的一句,汇编里什么寻址方式,C语言里讲什么,语言应该是相通的,不过貌似中文版的那些什么作者们或者译者们是互不往来似的(当然,像侯捷这样的大师除外)

       就是这样了,菜鸟goes on~~

网课、网页视频倍速播放简单脚本 一个简单的网页视频倍速脚本 阅读详情

相关推荐

Codex登录要手机验证码?Cockpit Tools跳过验证保姆级教程

摘要:OpenAI升级风控后,Codex登录需手机验证,增加批量账号使用成本。CockpitTools(GitHub 8.3k star)可绕过验证,支持多AI编程平台账号管理。操作步骤:1) 获取ChatGPT网页Session数据;2) 通过转换工具生成CPA格式JSON;3) 导入工具启动Codex。注意:仅适用于未绑定手机号的账号,Session会过期,且需防范数据泄露风险。商业账号通常直接提供认证文件。(150字)

5825

c++指针小结

变量的指针即变量的地址,用来存放变量地址的变量是指针变量 在定义指针变量时必须指定其基类型,而指针变量的基类型就是该指针变量指向的变量的类型,定义指针变量的一般形式:基类型*指针变量名 基本类型可以用char,int,float等系统已经定义好的类型标识符来表示,指针类型应明确指出基类型 不能用一个整数去给一个指针变量赋值 一个指针变量只能指向同一个类型的指针 说明指针类型时应完整描述,如a是指...

小道名宇 229

车载以太网测试技术解析

在智能汽车与HiL测试领域,高效解析与模拟车载网络通信是开发验证的关键。ZD-Converter 2000以媒体/介质转换器、嗅探器、拦截器、仿真器四合一的颠覆性设计,成为工程师应对复杂车载以太网测试的瑞士军刀。它支持双路车载/标准以太网智能转换、实时通信嗅探、硬件级数据拦截及ECU通信模拟,更通过串口命令实现全参数远程配置,赋能自动化测试流程。本文将深度解析其核心功能与实战应用场景。

Triv2025的博客 1142

C++函数指针总结1

转载自:/***   作者:钱书康*   欢迎转载,请保留此段声明。*   出处:http://www.cnblogs.com/zrtqsk/ */ 学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了。本博文详细介绍一下常见的各种坑爹的函数指针。  至于指针的详细学习,推荐这篇博文C++指针详解  与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代...

I_O_fly的博客 333

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 249

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9239

C/C++ 函数指针使用总结

一 函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下: intadd(intnLeft,intnRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int(*pf)(int,int);/...

weixin_30878361的博客 561

【技能---ubuntu20.04更换国内镜像源】

安装好ubuntu20.04后,在下载软件等安装包的时候,速度特别的慢,为此就想着更换一下镜像源,以此来增加下载的速度!!!下面是换源的具体流程!!!提示:以下是本篇文章正文内容,下面案例可供参考以上到这里就更换完软件源了,如有不足之处,请大家斧正!!!

fyc300的博客 1万+

cpp中函数指针

与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。可以编写将另一个函数的地址作为参数的函数。这样第一个函数将能够找到第二个函数,并运行它。与直接调用另一个函数相比,这种方法很笨拙,但它允许在不同事件传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。python中函数是一等公民,装饰器就是传函数。 1.函数指针的基本知识 假设要设计一个名为estimate()的函数,估算编写指定函数代码的时间,并且希望不同的程序员都将使用该函数。在py就...

liguandong 2152

三极管自激升压电路设计 - 从参数计算到实践验证

本文详细解析了三极管自激升压电路(焦耳小偷电路)的设计原理与实践方法。通过剖析自激振荡机制与三极管电流关系,指导读者完成从核心参数计算、关键元件选型到面包板搭建调试的全过程。文章重点阐述了如何利用电感、三极管等基础元件实现低压直流到高压的转换,是理解开关电源与电磁能量转换的绝佳实践项目。

weixin_29250573的博客 365

保姆级教程:一步步创建 ABAP Text Table

有朋友反馈,问有没有一个自己动手创建 Text Table 的例子,因为自己没有动手实践过,总觉得心里不踏实。这个行为的语义是,ZAI_TYPE_T 这张表的 AI_TYPE 字段值,不能随便维护,必须是表。然后另一个需要添加的字段是 AI_TYPE 这个字段值对应的文本值,本例笔者采用 SAP 标准的。也是自己创建的,很简单的一个 Data Element,类型为 CHAR,长度为 2.依次给主表的 01,02,03 三个字段值维护对应的描述信息,最后效果如下。按照下面的字段结构,创建另一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4273

c/cpp函数指针

以前在学c的时候对于函数指针的概念没有怎么仔细看,现在回来温习一下,做个记录以后方便回看 因为太简单了,直接把代码pull在这 int main(){ int choose; printf("1.传统调用函数\n"); printf("2.利用函数指针调用\n"); printf("3.函数指针作为参数\n"); printf("please input your choose:\n"); scanf("%d", &choose); switch (choose) { case 1

克豪的博客 1205

Palantir 凭什么两年涨 20 倍?深度解析解决 AI 幻觉的 “本体论“ 核心原理

本文深度解析了Palantir本体(Ontology)的核心原理及其在企业AI应用中的革命性价值。本体通过构建结构化的语义层与动态执行层,将企业分散的数字资产(数据集、虚拟表、模型)映射为现实世界的数字孪生,使大模型能够在**严格的业务规则与数据边界内**进行推理与决策,从而从架构层面彻底解决AI幻觉问题。这一技术架构不仅帮助Palantir实现股价两年增长20倍、市值突破4000亿美金的商业成功,更成为SAP、Salesforce等ERP巨头争相模仿的下一代企业智能标准范式。通过航空业飞机故障应急处理等实

program哲学 218

C和C++语言中的函数指针

这里int (MyClass::*member_func_ptr)(int)是类成员函数指针的声明,通过(obj.*member_func_ptr)(3)或者(ptr->*member_func_ptr)(3)的方式来调用成员函数。在这个例子中,func_ptr只能指向参数为int的print函数,不能直接指向参数为double的print函数。与类成员函数的结合(需要注意):在 C++ 中,普通函数指针不能直接指向类的成员函数,因为类成员函数有一个隐含的this指针。,这两种写法在 C 语言中是等价的。

wgf350357114的博客 968

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++】仿函数与函数指针:C++中的强大工具

函数指针是指向函数的指针。在C++中,函数也是一种特殊的数据类型,因此可以有指向函数的指针。函数指针使得程序能够根据需要调用不同的函数,增加了代码的灵活性和可重用性。仿函数,或称为函数对象,是一个行为类似函数的对象。在C++中,任何实现了operator()的类实例都可以作为仿函数。仿函数可以保存状态,这是它与普通函数和函数指针的一个重要区别。在C++中,使用std::sort函数进行排序时,既可以使用仿函数(Functor)也可以使用函数指针来自定义排序规则。

Colorful___的博客 1621

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

关于C++的函数指针以及它在C++11中的变化

主要记录了C++的函数指针的使用方法,以及它在C++11中的使用变化

Azahaxia的博客 921

ssm框架搭建

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

C/C++中的函数指针

C/C++中的函数指针 一、引子 今天无聊刷了leetcode上的一道题,如下: Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two mid...

ajyb9460的博客 166

C++中的指针(函数指针)

先说一下C式的函数指针。这种函数指针的应用十分广泛。对于任何函数 void print(string s),它的指针这样定义:void (*pfun)(string) = NULL;pfun= &print; 或者 pfun = print;两种写法没有区别。pfun是指针变量名。可以指向任何只带一个string参数,返回void的函数。这里让它指向print()函数。以后调用它的时候直接写if

jianxiong8814的专栏 1150

c++中的函数指针

1.函数指针是指向函数的指针变量,即本质是一个指针变量。 2.定义: int(*func)(int, int) 调用:int min(int x,int y); func = &amp;min 或func = min 3.例子:【奇数放前,偶数放后】 void Reorder(int* pData, int length, bool(*func)(int)) { if...

qq_33457548的博客 158

类的函数对象与函数指针:C++中的函数对象与函数指针

1.背景介绍 1. 背景介绍 C++是一种强大的编程语言,它提供了丰富的功能和特性,使得开发人员可以编写高效、可靠的软件。在C++中,函数对象和函数指针是两个重要的概念,它们在实现算法和数据结构时具有重要的作用。本文将深入探讨C++中的函数对象和函数指针,并提供一些实际的最佳实践和代码示例。 2. 核心概念与联系 2.1 函数指针 函数指针是指向函数的指针,它可以用来存储函数的地址。在C...

AI天才研究院 1041

C++中的指针(二) 函数指针

原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?BoardID=56&ID=92806先说一下C式的函数指针。这种函数指针的应用十分广泛。对于任何函数 void print(string s),它的指针这样定义:void (*pfun)(string) = NULL;pfun= &print; 或者 pfun = print;两种写法没有区别。pfun是指针变量名

不忘初心 838

C++中的指针 -- 函数指针

先说一下C式的函数指针。这种函数指针的应用十分广泛。对于任何函数 void print(string s),它的指针这样定义:void (*pfun)(string) = NULL;pfun= &print; 或者 pfun = print;两种写法没有区别。pfun是指针变量名。可以指向任何只带一个string参数,返回void的函数。这里让它指向print()函数。以后调用它的时候直接写if

阿丹的彩蛋 948

C++中的函数指针和函数对象总结

篇一、函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。 函数指针的声明方法: 数据类型标志符 (指针变量名) (形参列表); 一般函数的声明为:  int func ( int x ); 而一个函数指针的声明方法为: int (*

microsoftwin32的专栏 506

C/C++中的函数指针的使用与总结

概要: 函数指针介绍 typedef简化函数指针的定义 指向函数的指针的初始化和赋值 通过指针调用函数 函数指针形参 返回指向函数的指针 指向重载函数的指针 参考《C++ Primer》 第五版 函数指针介绍 函数指针是C++中比较灵活而且重要的部分,对于软件的灵活度上有很大的帮助 ! 函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特...

weixin_30359021的博客 67
上一篇: C++中的内联函数inline总结
下一篇: 最近发现基础很不给力啊,char*遇到的一些问题
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值