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);
}

 

【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection 文章目录摘要1. Introduction 摘要 motivations: 基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。 contributions: 提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。 experiments: 在BSDS500 阅读详情

相关推荐

从PHY芯片看工业网络精准时钟:IEEE 1588v2(PTP)协议实现与选型指南

本文深入解析了工业网络中IEEE 1588v2(PTP)协议的实现与PHY芯片选型要点。通过对比KG7101、RTL8211F等芯片的关键参数,揭示硬件时间戳对纳秒级时钟同步的决定性作用,并提供PTP网络设计中的拓扑布局与配置优化技巧,助力工业自动化场景实现精准时间同步。

weixin_42628688的博客 501

typedef用法和理解

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

acsder2010413的专栏 556

AI报告撰写实战指南:从提示词工程到全流程优化的底层逻辑与实践突破

传统AI写作常被诟病为“信息拼贴”——模型虽能生成文本,却常出现逻辑断裂、数据矛盾、风格不符等问题。而“全流程优化”则是通过系统化设计,将报告生成拆解为需求解析→数据对齐→提示词设计→初稿生成→迭代优化→格式适配六大环节,每个环节均通过技术手段提升输出质量。提示词工程:本质是通过结构化指令(如角色设定、任务分解、格式约束、示例引导)精准控制模型输出方向,是连接用户需求与模型能力的“翻译器”。全流程优化。

2501_92808811的博客 884

typedef int (* func)(int ,int )

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

weixin_43239416的博客 1476

工业视觉检测实战指南:从硬件配置到AI算法部署

本文提供了一套完整的工业视觉检测系统搭建实战指南。从硬件选型(相机、光源、镜头、工控机)到AI算法(深度学习模型)部署,详细解析了如何为生产线配置一双“会思考的眼睛”。重点探讨了深度学习算法在复杂缺陷识别中的应用,并分享了模型训练、优化及云边协同部署的实战心得,旨在帮助工程师实现从实验室Demo到7x24小时稳定运行的工业落地。

weixin_29051193的博客 458

自定义Usecase/Pipeline

Summary of Custom Usecase and Pipeline Configuration in SA8650 QCX Framework This article elaborates on the complete process of customizing a new Usecase and Pipeline based on the SA8650 QCX framework to meet OEM and Tier1 customization requirements, with

qq_39257814的博客 929

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

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

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

LVGL 拨盘菜单(Dial Menu)

h。

摸鱼专家 191

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

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

weixin_34194551的博客 298

Windows原生与WSL2环境下OpenClaw性能与兼容性的对比分析研究

本文对比分析了Windows原生环境与WSL2环境下运行OpenClaw的性能与兼容性。Windows原生环境提供深度系统集成、图形界面支持和硬件加速优势,适合需要Windows生态集成的用户;WSL2则提供接近原生Linux的性能体验,兼容Linux工具链,适合开发者和跨平台需求。文章详细介绍了两种环境下的推荐硬件配置、系统版本选择及必备工具,并提供了具体的部署步骤指南。研究表明,两种环境各有适用场景,用户可根据需求选择最适合的部署方式。

一键难忘的博客 1218

IEC 60747-8 是由国际电工委员会(IEC)制定的标准,标题为《半导体器件 - 分立器件 - 第8部分:场效应晶体管》

IEC 60747-8 是由国际电工委员会(IEC)制定的标准,标题为《半导体器件 - 分立器件 - 第8部分:场效应晶体管》(Semiconductor devices - Discrete devices - Part 8: Field-effect transistors)。该标准详细规定了场效应晶体管(FETs)的测试方法,涵盖静态和动态特性测试,适用于多种类型的FET,包括结型场效应晶体管(JFETs)、绝缘栅场效应晶体管(MOSFETs,增强型和耗尽型)等。3. 标准其他部分(简要概述)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 573

c++函数指针

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

weixin_50866517的博客 1万+

AI辅助Android开发:从传统到智能化的技术演进

AI辅助开发的核心在于利用算法模型自动化或优化传统任务。在Android开发中,AI可应用于需求分析、设计、编码、测试和维护各阶段。需求分析:AI工具如基于NLP的模型(例如GPT系列)可解析用户需求文档,自动生成用户故事和原型设计。假设产品需求为“开发一个航班查询应用”,AI能提取关键词,输出UML图或伪代码。代码生成:使用AI代码助手(如GitHub Copilot),工程师输入自然语言描述,AI生成Java/Kotlin代码片段。

郑伟强dev的专栏 137

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

逢歌的博客 7622

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++函数指针用法

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

qq_48201696的博客 8375

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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、付费专栏及课程。

余额充值