c++的指针(函数指针2)


<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<script src="http://wz.youkuaiyun.com/javascripts/vote.js" type="text/javascript"></script> C++指针探讨 (二) 函数指针

  在C/C++中,数据指针是最直接,也最常用的,因此,理解起来也比较容易。而函数指针,作为运行时动态调用(比如回调函数 CallBack Function)是一种常见的,而且是很好用的手段。

  我们先简单的说一下函数指针。(这一部份没什么价值,纯是为了引出下一节的内容)

 2 常规函数指针

void ( * fp)();

  fp 是一个典型的函数指针,用于指向无参数,无返回值的函数。

void ( * fp2)( int );

  fp2 也是一个函数指针,用于指向有一个整型参数,无返回值的函数。
  当然,有经验人士一般都会建议使用typedef来定义函数指针的类型,如:

typedef void ( * FP)();
FPfp3;
// 和上面的fp一样的定义。

  函数指针之所以让初学者畏惧,最主要的原因是它的括号太多了;某些用途的函数指针,往往会让人陷在括号堆中出不来,这里就不举例了,因为不是本文讨论的范围;typedef 方法可以有效的减少括号的数量,以及理清层次,所以受到推荐。本文暂时只考虑简单的函数指针,因此暂不用到typedef。

  假如有如下两个函数:

void f1()
{
std::cout
<<"callf"<<std::endl;
}


void f2( int a)
{
std::cout
<<"callf2("<<a<<")"<<std::endl;
}

  现在需要通过函数指针来调用,我们需要给指针指定函数:

fp = & f1; // 也可以用:fp=f1;
fp2 = & f2; // 也可以用:fp2=f2;
void ( * fp3)() = & f1; // 也可以用:void(*fp3)()=f1;
// 调用时如下:
fp(); // 或(*fp)();
fp2( 1 ); // 或(*fp2)(1);
fp3(); // 或(*fp3)();

  对于此两种调用方法,效果完全一样,我推荐用前一种。后一种不仅仅是多打了键盘,而且也损失了一些灵活性。这里暂且不说它。

  C++强调类型安全。也就是说,不同类型的变量是不能直接赋值的,否则轻则警告,重则报错。这是一个很有用的特性,常常能帮我们找到问题。因此,有识之士认为,C++中的任何一外警告都不能忽视。甚至有人提出,编译的时候不能出现任何警告信息,也就是说,警告应该当作错误一样处理。

  比如,我们把f1赋值给fp2,那么C++编译器(vc7.1)就会报错:

fp2 = & f1; // errorC2440:“=”:无法从“void(__cdecl*)(void)”转换为“void(__cdecl*)(int)”
fp1 = & f1; // OK

  这样,编译器可以帮我们找出编码上的错误,节省了我们的排错时间。

  考虑一下C++标准模板库的sort函数:

// 快速排序函数
template<typename RandomAccessIterator, typename BinaryPredicate>
void sort(
RandomAccessIterator_First,
// 需排序数据的第一个元素位置
RandomAccessIterator_Last, // 需排序数据的最后一个元素位置(不参与排序)
BinaryPredicate_Comp // 排序使用的比较算法(可以是函数指针、函数对象等)
);

  比如,我们有一个整型数组:

int n[ 5 ] = {3,2,1,8,9} ;

  要对它进行升序排序,我们需定义一个比较函数:

bool less( int a, int b)
{
returna<b;
}

  然后用:

sort(n,n + 5 ,less);

  要是想对它进行降序排序,我们只要换一个比较函数就可以了。C/C++的标准模板已经提供了less和great函数,因此我们可以直接用下面的语句来比较:

sort(n,n + 5 ,great);


  这样,不需要改变sort函数的定义,就可以按任意方法进行排序,是不是很灵活?
  这种用法以C++的标准模板库(STL)中非常流行。另外,操作系统中也经常使用回调(CallBack)函数,实际上,所谓回调函数,本质就是函数指针。

  看起来很简单吧,这是最普通的C语言指针的用法。本来这是一个很美妙的事情,但是当C++来临时,世界就开始变了样。
  假如,用来进行sort的比较函数是某个类的成员,那又如何呢?

脑电分析中的频谱特征提取 —— 从理论到实践 本文系统介绍了脑电信号(EEG)频谱特征提取方法及其应用。EEG信号通过频谱分析可分为Delta、Theta、Alpha、Beta和Gamma等具有明确生理意义的频段。文章详细讲解了功率谱密度、频带功率、相对功率、频谱熵等关键特征的计算方法,并提供了Python实现示例,包括模拟数据和真实CHB-MIT癫痫数据集的处理流程。这些频谱特征在脑机接口、情绪识别、疲劳监测和癫痫检测等领域具有重要应用价值。文章强调频谱特征结合时域和非线性特征可提升分析效果,为EEG研究提供了实用指导。 阅读详情

相关推荐

Minitab实战:用Weibull分布预测产品寿命的5个关键参数(附真实案例)

本文通过一个真实的电容器老化测试案例,详细介绍了如何运用Minitab软件进行Weibull分布分析,以预测产品寿命。文章深入解读了形状参数β、尺度参数η等五个关键参数的工程意义与商业价值,指导工程师从失效数据中提取洞察,并将其应用于可靠性评估、保修策略制定及成本预估等实际业务决策。

weixin_29231263的博客 523

C++指针探讨 (二) 函数指针

  在C/C++中,数据指针是最直接,也最常用的,因此,理解起来也比较容易。而函数指针,作为运行时动态调用(比如回调函数 CallBack Function)是一种常见的,而且是很好用的手段。   我们先简单的说一下函数指针。(这一部份没什么价值,纯是为了引出下一节的内容)     2 常规函数指针         void(*fp)();   fp 是一个典型的函数指针,用于指向无参数...

weixin_34090562的博客 149

避开STM32中断优先级配置的坑:HAL_NVIC_SetPriority()参数你真的用对了吗?

本文深入解析STM32中断优先级配置中的关键问题,重点剖析HAL_NVIC_SetPriority()函数的正确使用方法。通过实际案例揭示优先级分组设置、抢占优先级与子优先级的区别,提供多中断系统中的优化策略和调试技巧,帮助开发者避免常见配置错误,提升系统稳定性。

weixin_42532938的博客 424

不容错过!!C语言-回调函数详解

超详细回调函数

weixin_44127729的博客 6003

利用LTspice设计Pt100测温电路

是一种广泛使用的温度传感器,它属于(RTD, Resistance Temperature Detector)的类型,通常用于温度测量。在0°C时,的电阻值为100欧姆,且它的电阻值会随着温度的升高而升高。PT100热电阻温度阻值对应表)因此可以根据这一特性来检测出环境温度。

2301_77033628的博客 2417

Lumerical FDTD新手教程:5步搞定MMI波导光谱模拟(附避坑指南)

本文提供Lumerical FDTD新手教程,详细讲解5步完成MMI波导光谱模拟的实用方法,包括环境准备、结构建模、光源配置、仿真优化和结果分析。特别针对多模干涉耦合器(MMI)的模拟难点,提供避坑指南和优化策略,帮助光学工程师快速掌握FDTD仿真技术。

kite3的博客 359

C++指针探讨

C++指针探讨整理:Ackarlix  一、数据指针    指针,在C/C++语言中一直是很受宠的;几乎找不到一个不使用指针的C/C++应用。用于存储数据和程序的地址,这是指针的基本功能。用于指向整型数,用整数指针(int*);指向浮点数用浮点数指针(float*);指向结构,用对应的结构指针(struct xxx *);指向任意地址,用无类型指针(void*)。    有

Ackarlix的专栏 1477

Unity URP风格化水面Shader全流程实现与性能优化指南

在游戏开发中,Shader是实现特定视觉风格的核心技术,它通过编写在GPU上运行的程序,控制模型每个像素的最终颜色与光照表现。其原理在于对顶点位置、纹理坐标、光照信息及深度等数据进行一系列数学运算与插值。这项技术的价值在于能够以极高的自由度创造从写实到卡通的各种渲染效果,同时通过算法优化实现对硬件资源的精准控制。在移动游戏、独立游戏等对性能与风格化有强烈需求的场景中,自定义Shader尤为重要。本文聚焦于使用Unity URP渲染管线,从零构建一个高效的风格化水面Shader,详细拆解了深度色、波浪动画、边

weixin_34320724的博客 372

c++函数指针

函数指针函数指针基础知识深入探讨函数指针使用typedef进行简化 函数指针基础知识 1.完成函数指针需要的工作: 获取函数的地址 声明一个函数指针 使用函数指针来调用函数 1.获取函数地址:只要使用函数名即可。也就是说,如果think()是一个函数,则think()就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。一定要区分传递的是函数的地址还是函数的返回值: process(think); thought(think()); process()调用使得process()函数能够在其内部调

weixin_50866517的博客 1万+

PCI-Express、MiniPCIe、ExpressCard接口转换说明/引脚互换关系

通过引脚PIN互换可以在PCI-Express、MiniPCIe、ExpressCard之间切换不同的接口;提供接口引脚表和标准尺寸图。

tech34的博客 7125

在微信小程序中如何引入iconfont

略

sayyy的专栏 4326

c++函数指针2.0

三.成员函数指针 成员函数指针是C++中最麻烦的东东之一,准确的说是非静态成员函数指针。1.静态成员函数指针 静态成员函数指针与普通函数指针一样,我们看一个例子:// C++Test.cpp : 定义控制台应用程序的入口点。 ////#include “stdafx.h” //#include //#include //#include using namespace std;/

橙子的博客 336

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 160

C++ 函数指针2

对于以下三个函数 const double *f1(const double ar[],int n) const double *f2(const double [],int n) const double *f3(const double* ,int n) 第一个参数虽然是三种形式, 但是表达的都是一种意思, 因此 可以使用一个函数指针的数组来同时存储这三个函数的指针 和之前的方法一...

weixin_30823833的博客 142

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++易混知识点2. 函数指针和指针函数的区别

我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念。指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间,但是所带来的好处就是C++如此强大的深层次原因了。 1. 指针函数, ( __type__ * func( void, int,) ) 顾名思义,他是一个函数,只不过和一般函数区分

elfprincexu的专栏 662

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++函数指针总结2

转载自:https://blog.youkuaiyun.com/sruru/article/details/7916296在C/C++中存在着函数指针,即指向函数的指针。我目前已知的两种使用方法是:  [cpp] view plain copy#include &lt;string.h&gt;  #include &lt;stdio.h&gt;  typedef int* PINNT;  #define PP...

I_O_fly的博客 258

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

cocos2dx3.2 C++再谈谈函数指针的简单使用

一般情况: void showMsg(float) {     cout << "show msg normal" endl; } void (*p)(float); 然后这样调用:     p = showMsg;     p(1.1f); 如果用于函数传递参数,这样就不是很方便使用了,于是有了下面这种: typedef void (*p

aiwobiezoukaicnew的专栏 537

【转】 C++易混知识点2. 函数指针和指针函数的区别

https://www.cnblogs.com/xiongyunqi/p/4389562.html 我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念。指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间,但是所带来的好处就是C++如此强大的深层次原因了。   转载请注明出处: http://blo...

wang13342322203的博客 278

c/c++ typedef定义函数指针(Hook前奏2)

简介 关于函数指针的介绍,点击超链接即可查看,这里就不做过多说明了,或者可以点击这里: https://blog.youkuaiyun.com/CSNN2019/article/details/112492092 关于typedef作用的介绍,点击超链接即可查看,这里就不做过多说明了,或者可以点击这里: https://blog.youkuaiyun.com/CSNN2019/article/details/112495262 接下来呢,我们一起来通过例子来讲解一下typedef 定义函数指针: #include<iostr

寻梦&之璐 5333

C++57个入门知识点_番外2_C++中指针函数、函数指针和返回值为函数指针的函数

顾名思义,指针函数即返回指针的函数。类型名 *函数名(函数参数表列);其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。“(函数参数表列)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。

分享学习成长历程,Winter is coming! 296

c++学习笔记2:函数指针及lambda使用

void(*func)(int)----指的是一个函数指针类型变量,变量名为func,该变量指向一种函数类型,该函数有一个int类型参数,返回值为void #include <iostream> #include <vector> void PrintValue(int value) { std::cout << value << std::endl; } void forEach(const std::vector<int>&

luobaotai的博客 632

C++ 11 把函数当作参数传递的2种方法 —— 函数指针。模板

#include<iostream> using namespace std; int add(int a,int b){ return a+b; } int add2(int a,int b){ return a*2+b; } int deal(int a,int b,int (*pf)(int,int)){ return pf(a,b); } tem...

小罗的学习博客 2099

【系列】C/C++函数指针详解-2

摘要:这篇文章详细介绍C/C++的函数指针,请先看以下几个主题:使用函数指针定义新的类型、使用函数指针作为参数、使用函数指针作为返回值、使用函数指针作为回调函数、使用函数指针数组,使用类的静态函数成员的函数指针、使用类的普通函数成员的指针、定义函数指针数组类型、使用函数指针实现后绑定以及在结构体中定义函数指针。如果您对以上这几个主题都很了解,那么恭喜您,这篇文章不适合您啦~。在一些开源软件中,如Boost, Qt, lam-mpi中我们经常看到函数指针,本文目的是彻底搞定函数指针的语法和语义,至于怎样将函数

相信并热爱着 679

C/C++总结笔记——指针2:二级指针、指针数组&数组指针、函数指针(回调函数)&函数指针数组、二维指针数组&数组指针

C/C++总结笔记

LW_12345的博客 544
上一篇: C#写的驱动摄像头的程序
下一篇: 声明函数指针并实现回调
wapysun
博客等级 码龄19年 14粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值