C++中函数指针的使用

[C++11类型别名 cpp]——为函数指针定义别名 这里定义了一个名为fp的函数指针,它指向一个返回值为int型,带有两个int型参数的函数。如果我们需要多次使用这个类型声明,或者函数指针类型甚至出现在类成员变量或模板参数中,那么这种冗长的类型声明语句将极大地影响代码的可读性和可维护性。除此之外,在C++11中还增加了一种特殊的类型别名语法——using关键字,使得我们可以更加灵活地为类型定义别名。总之,在C++11中,除了原有的typedef语法外,我们还可以使用using关键字来为任意类型定义别名,这使得代码更加简明扼要,便于理解和维护。 阅读详情

    在C/C++中存在着函数指针,即指向函数的指针。我目前已知的两种使用方法是:

  

#include <string.h>
#include <stdio.h>
typedef int* PINNT;
#define PP int*

int funcA(int a,int b);
int funcB(int* a,int *b);
int  main(int argc, char *argv[])
{
	int (*func)(int,int);
	//func = &funcA;
    func = funcA;
	//两种赋值给函数指针的方法都可以
	printf("%d",func(1,10));
	//printf("%d",(*func)(1,10));
	//两种调用函数指针的方法都可以
	//两种赋值方法和两种调用方法可以任选一种组合
	
}

int funcA(int a,int b)
{
	return a + b;
}

int funcB(int* a,int *b)
{
	(*a) = (*a) + (*b);
	return 1;
}


 

这里int (*func)(int,int)定义了一个函数指针变量,可以接受函数名或者函数名的指针(这里我还没有很清楚)。

 

然后我在优快云上面找到了一个例子,据说是华为的面试题目,代码如下,这时程序正常输出值为110。

#include <stdio.h> 
int   inc(int   a) 
{ 
	return(++a); 
} 

int   multi(int*a,int*b,int*c) 
{ 
	return(*c=*a**b); 
} 

typedef   int(FUNC1)(int); 
typedef   int(FUNC2)(int*,int*,int*); 

void   show(FUNC2   fun,int   arg1,   int*arg2) 
{ 
	FUNC1   *p = &inc; 
	int   temp   =p(arg1); 
	fun(&temp,&arg1,   arg2); 
	printf( "%d\n ",*arg2); 
} 

main() 
{ 
	int   a; 
	show(multi,10,&a); 
	getchar(); 
	return   0; 
}

一开始我没有理解这个用法的时候,以为这里使用的方法与方法一相同,故直接写成


typedef   int(FUNC1)(int); 
typedef   int(FUNC2)(int*,int*,int*); 

void   show(FUNC2   fun,int   arg1,   int*arg2) 
{ 
	FUNC1  = inc; 
	int   temp   =p(arg1); 
	fun(&temp,&arg1,   arg2); 
	printf( "%d\n ",*arg2); 
} 


这时候,编译器给出的提示是:

1>d:\vctest\test4\test4\test4.c(17) : error C2513: 'int (int)' : no variable declared before '=' 

FUNC1 = inc这个语句的左边没有变量被申明,这个错误提示说明利一点:FUNC是一种类型而不是一个变量。做出如下更正:

 

	FUNC1  *p = inc; 


程序正确,更加证明了

typedef   int(FUNC1)(int); 
typedef   int(FUNC2)(int*,int*,int*); 

语句定义了两个自己的数据类型FUNC1和FUNC2,这两个类型申明的变量用保存函数指针

 

 也可以采用下面的方式进行定义:

typedef   int (*FUNC1)(int); 
typedef   int (FUNC2)(int*,int*,int*); 

void   show(FUNC2   fun,int   arg1,   int*arg2) 
{ 
	FUNC1  p = inc; 
	int   temp   = p(arg1); 
	fun(&temp,&arg1,   arg2); 
	printf( "%d\n ",*arg2); 
} 
 

 

以上例子,涉及到的概念有函数指针,函数类型和函数指针变量

函数指针变量有两种实现方法:

    1. 先申明函数指针类型,在用函数指针类型申明函数指针变量

    //typedef void FunType(int);  -- FunType:同样是一个函数指针类型。

typedef void (*PF)(int,int);
//使用函数指针类型申明的变量就是函数指针变量
//PF a = &inc//PF a = inc

    2. 直接定义一个函数指针变量

 

void (*fPV)(int,int);
fvp  = inc // fvp = &inc


函数类型与函数指针变量

    如何定义函数类型呢

   

typedef void (FT)(int,int);

    申明的函数类型如何使用呢?

 

首先可以用来申明函数:

FT x,y等价于:

void x(int,int);

void y(int,int);

请看如下的示例:

#include <stdio.h> 

typedef int (FT)(int*,int*);
FT x,y;


main() 
{ 
	int a = 1,b=2;
	x(&a,&b);
	(*y)(&a,&b);
}

int x(int* a,int*b){
	*a = *a + *b;
	printf("%d\n",*a);
}

int y(int*a,int* b){
	*a = *a * (*b);
    printf("%d\n",*a);
}


 

上面的程序输出3和6

 

#include <stdio.h> 

typedef int (FT)(int*,int*);
FT x,y,*z,u;


main() 
{ 
	int a = 1,b=2;
	x(&a,&b);
	(*y)(&a,&b);
	z = x;//这里x是一个函数名,但是编译器会把函数名转换为函数指针变量,所以也可以显式写成z = &x;
	x(&a,&b);
	//u = x;//这里出错了这里u是一个函数名称,是一个指针常量,类似于数组名称,是不能够被赋值的
}

int x(int* a,int*b){
	*a = *a + *b;
	printf("%d\n",*a);
}

int y(int*a,int* b){
	*a = *a * (*b);
    printf("%d\n",*a);
}


上面的例子中FT *Z其实是申明了一个指向函数的函数指针变量,类似于int(*z)(int*,int*)。

 

最后再来看下那个困扰了我很久的例子吧:

#include <stdio.h> 
int   inc(int   a) 
{ 
	return(++a); 
} 

int   multi(int*a,int*b,int*c) 
{ 
	return(*c=*a**b); 
} 

typedef   int (*FUNC1)(int); 
typedef   int (FUNC2)(int*,int*,int*); 
typedef   int (FUNC3)(int*,int*,int*); 

void   show(FUNC2 *fun,int   arg1,   int*arg2) 
//void   show(FUNC2 fun,int   arg1,   int*arg2)//这里做这样的声明也一样是对的 
{ 
	FUNC1  p = &inc; 
	FUNC2 *q = multi;
	int   temp   = (*p)(arg1); 
	(*fun)(&temp,&arg1,   arg2);
	//fun(&temp,&arg1,   arg2); //这里的两种调用方法和上面的恶两种声明方法可以任意组合,,原因是函数名和函数指针常量的隐式转换
	printf( "%d\n ",*arg2); 
} 

main() 
{ 
	int   a; 
	show(multi,1,&a); 
	getchar(); 
	return   0; 
}

最让我疑惑的是

void   show(FUNC2 *fun,int   arg1,   int*arg2)
//void   show(FUNC2 fun,int   arg1,   int*arg2)//这里做这样的声明也一样是对的

这两种声明方式都是对的,采用void   show(FUNC2 fun,int   arg1,   int*arg2)//这里做这样的声明也一样是对的这种方式声明, show(multi,1,&a);调用时正确的,

而前面的代码中,我也说过//u = x;//这里出错了这里u是一个函数名称,是一个指针常量,类似于数组名称,是不能够被赋值的, 这个问题困扰我很久啊,仔细考虑之后,我个人的观点是:void   show(FUNC2 fun,int   arg1,   int*arg2)使用一个函数做为形式参数,调用时传递一个函数名字给他就可以,也可以传递一个函数常量指针。类比于使用指针常量或者数组作函数书参数的时候

#include <stdio.h> 

typedef void (FT)(int* const a);
FT z;
void main()
{
	int a[]={1,2,3,4,5};
	int b = 5;
    int *c = &b;
	z(a);
	//但是如果在这里给a = c是不对的
}

void z(int* const a)
{
	printf("%d",*a);
}

 

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南) 本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。 阅读详情

相关推荐

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整论文+代码+结果

2024国赛A题参考论文。2024国赛D题参考论文。2024国赛E题参考论文。2024国赛B题参考论文。2024国赛C题参考论文。

qq_52590045的博客 5358

typedef用法和理解

一、typedef定义 我们在编码中经常遇到使用typedef来定义类型,定义出来的类型并不是一种新类型,而是给原有类型定义了一个“同义词”,意即可以在程序中使用该“同义词”来替代旧类型. typedef int Width; //定义了新类型Width,实际为整型 使用typedef定义类型有两个优点: 1.  可以更好的表达代码,如用Width替代int定义的一类变量,可以很清楚的表

acsder2010413的专栏 556

【Verilog】valid-ready双向握手机制 ——很绕但是很有意思

valid-ready双向握手机制。

GalaxyerKw的博客 1万+

typedef int (* func)(int ,int )

typedef int (* func)(int ,int ) int (* func)(int ,int ) 一个函数指针的声明 typedef 定义了一个 函数指针声明的***类型*** func 作为一个类型 可以 声明 变量/。 func a = 函数; ...

weixin_43239416的博客 1476

Windows批处理脚本实战:用Ping命令打造简易网络监控工具(附完整代码)

本文介绍如何利用Windows批处理脚本和Ping命令,快速构建一个轻量级、自动化的网络监控工具。该方案无需额外安装软件,通过周期性探测目标IP连通性,并将结果(成功、失败及延迟)自动记录到带时间戳的日志文件中,适合中小团队或临时监控需求,实现低成本、高效率的网络状态监控。

5f4d3s2a1q的博客 494

若依前后端分离版实战:MQTT集成保姆级教程(含MQTTX测试工具使用)

本文详细介绍了在若依前后端分离架构中集成MQTT协议的完整流程,包括环境搭建、核心配置、安全实践及性能优化。通过MQTTX测试工具的使用和实战代码示例,帮助开发者快速实现物联网场景下的实时通信功能,提升系统稳定性和效率。

weixin_30664051的博客 456

【C++ 函数尾部返回】C++中的尾返回类型:探究auto func() -> ReturnType的魔力

C++11是C++语言的一个重要里程碑,它引入了许多新的语法和特性,如`auto`(自动类型推导)、`nullptr`(空指针)、`lambda`(匿名函数)等,以简化代码和提高效率。这些新特性不仅让编程变得更加灵活,而且也让代码更加直观和易读。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 903

DDR4 IP的用户接口

DDR4 IP核用户接口

bowen_wener的博客 1925

学习C++ -> 函数( Function )

学习C++ -&gt; 函数( Function )   一、函数的介绍    在过程化编程中, 为了将一个较大的功能顺利实现, 通常会将这个大的功能进行分解, 例如要实现一个学生信息管理系统, 一个学生信息管理系统至少包括学生信息的 添加、查询、删除、修改 等功能, 这些功能要求就是对该系统的初步分解, 然后以 查询 功能为例对其继续分解, 查询 功能可以再次分解为由以下几个功能组成的模块:...

weixin_34194551的博客 298

【数据集】未来不同情景下预测数据:如人口、土地利用等

未来不同情景下预测数据:如人口、土地利用等

WW、forever的博客 2995

14、多层螺旋 CT 技术详解

本文详细解析了多层螺旋CT(MSCT)技术的原理与应用,涵盖其相对于单层螺旋CT的优势,包括图像采集速度提升、分辨率提高和噪声降低。文章深入探讨了扫描仪的几何结构、离散投影模型以及关键参数如切片宽度和螺距的影响,并重点介绍了z-滤波重建算法及其离散实现流程。通过流程图和公式推导,系统梳理了从投影获取到图像重建的全过程。同时分析了MSCT在临床中的实际应用案例及未来发展趋势,如更高分辨率、更低辐射剂量和智能化算法等方向,全面展示了MSCT在现代医学影像中的核心价值。

f0g1h2的博客 195

c++函数指针

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

weixin_50866517的博客 1万+

基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例

以下是一个基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例。这个系统使用langchain库进行文档处理、检索,以及与大语言模型交互。

max500600的博客 743

c++ 将函数指针存入map中调用

1、普通函数指针 #include "stdafx.h" #include<map> #include<string> #include"FunMap.h" #include<stdio.h> typedef int(*FUN1)(int a); int a(int i) { printf("类外函数指针存入map调用%d\n",i); return 9; } int main() { map <int, FUN1> mapfun; mapf

bhbhhyg的博客 4514

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

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

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

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

C++ 函数指针的声明与使用

C++函数指针 一 函数指针是什么 1.函数指针是指针 函数指针也是指针的一种,是指针的子集,所以它应该有指针的一些特性; 函数指针也附带了函数的一些特性。 2.函数指针该如何声明? 我们可以和int类型的指针的声明进行比对一下: 声明一个int型指针: int *p ; 声明一个函数型(假如是一个有两个int类型的参数以及一个 int类型的返回值)的指针: int (*pFunc)(int, int); 我们把指针名称提出来看一下, 整形指针 函数指针 int * int (*)(

逢歌的博客 7622

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++函数指针用法

C++函数指针详细理解 函数指针初识 函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为: type (*ptrname)(形参列表); 例子,声明一个比较两个字符串大小的函数指针 bool (*cp)(const string s1, const string s2); 需要注意的是,**不要去掉括号!!!**如果去掉括号,含义就变成了返回一个bool指针的函数的声明! 函数指针指向函数类型 再使用函数指针时,函数指针可以发挥与函数相同的功效,即

qq_48201696的博客 8375

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++函数指针的使用

一 函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数。pf前面有,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则pf可指向int(

qq_45131570的博客 1579

C++函数指针详解

详细的介绍了函数指针的使用方式。

韩小非的博客 4648

C++ 函数指针

C++ 函数指针,基于C++ Primer(中文版)(第5版)整理。

林晓松 729

cpp: 使用typedef定义函数指针

Java在对于oop的封装上面抽象程度非常的高;但是对于函数,java里面的函数或者方法,可以说是非常基础或者低级。纵观java的语言特性,没有对函数有更高程度的封装。 但是,除了在oop方面的抽象,在函数方面,也可以有很高程度的抽象。这一点,在javascript / python / c /c++上面就有所体现。 如果之前没有接触过对于函数的抽象,那么第一次接触会觉得比较难以理解。比如c++

Cat的专栏 6446

Cpp摘记:函数指针、函数模版、类模板

1. 函数指针 2. 函数模版 3. 类模板

zfoox的摘记 1331

C++函数指针学习

C++函数指针学习 博客搬家,原地址:https://langzi989.github.io/2017/09/08/C++函数指针学习/ 使用函数指针的优点 使用函数指针有助于我们设计出更优秀,更简洁更高效的程序。在下面的情景中我们常用到函数指针: 使用函数指针作为参数 使用函数指针作为返回值 使用函数指针作为回调函数 使用函数指针数组 类的静态方法和非静态方法的函数指针 使用函数指针实现动态绑...

langzi989的专栏 1857

细究C/C++函数指针

C/C++函数指针,std::function用法

sun_0228的博客 1360
上一篇: 一个C++开发App的代码实例分析
下一篇: 用C++语言做Linux开发工具之粘合剂Makefile
sruru
博客等级 码龄17年 54粉丝 28原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值