【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用 typedef 定义函数指针类型 )

文章目录

  • 一、函数指针语法
    • 1、函数名直接调用函数
    • 2、定义函数指针变量
    • 3、使用 typedef 定义函数类型
    • 4、使用 typedef 定义函数指针类型
  • 二、完整代码示例






一、函数指针语法




1、函数名直接调用函数


定义一个函数 , 如下 函数的类型是 int(int, int) ;

int add(int x, int y) {printf("x + y = %d\n", x + y);return x + y;
}

直接调用函数 : 该函数的 函数名 add 就是 函数地址 , 直接调用 add 函数 , 运行该函数 ;

	// 1. 直接调用// 直接调用 add 函数 , 运行该函数// 函数名 add 就是函数地址add(1, 2);

2、定义函数指针变量


如果不使用 add 函数名 调用函数 , 使用 函数类型的指针 也可以 调用函数 ;

函数 int add(int x, int y) 的 类型是 int(int, int) , 函数类型只需要注明函数的 返回值 和 参数列表 类型即可 ;

直接定义 int(int, int) 函数类型 的指针 , 将 add 函数名 ( 函数地址 ) 直接 赋值给 函数指针 , 可以直接通过函数指针调用函数 ;

下面的代码中 , 定义了函数指针 p , 指向 int(int, int) 类型的函数 , 将 add 函数地址 赋值给 函数指针 p , 之后通过 函数指针 p 调用 add 函数 ;

代码如下 :

	// 声明一个 int(int, int) 类型的指针变量// int(int, int) 类型 是 函数类型 // 该指针 指向 函数地址int(*p)(int, int) = add;// 通过函数指针调用 函数p(3, 4);

3、使用 typedef 定义函数类型


定义函数类型 语法格式如下 :

typedef returntype newfunname(parameterlist)
  • typedef 是 类型重命名 关键字 ;
  • returntype 是 函数返回值类型 ;
  • newfunname 是 定义的函数类型名称 ;
  • parameterlist 是 函数的参数列表 ;

定义函数类型示例 :int add(int x, int y) 函数的 函数类型 int (int, int) , 定义为 func_add 名称 , 使用时需要使用该类型的指针调用函数 , 也就是 func_add* 类型 ;

// int (int, int) 函数类型重命名为 func_add
// 使用时需要使用该类型的指针调用函数
typedef int fun_add(int, int);

使用定义的 函数类型 调用函数 : 定义函数类型 的 指针类型 func_add* 变量 , 然后 将 add 函数地址 赋值给 该指针变量 , 然后 通过 函数指针变量 调用该函数 ;

	// 定义函数指针类型变量fun_add* fun = add;fun(5, 6);

4、使用 typedef 定义函数指针类型


定义函数指针类型 语法格式如下 :

typedef returntype (*newfunname)(parameterlist)
  • typedef 是 类型重命名 关键字 ;
  • returntype 是 函数返回值类型 ;
  • * 表示 定义的是 指针类型 , 指向函数地址 ;
  • newfunname 是 定义的函数类型名称 ;
  • parameterlist 是 函数的参数列表 ;

定义函数类型示例 : 将指向 int add(int x, int y) 函数的 函数指针类型 int (*)(int, int) , 定义为 pFun_add名称 , 使用时需要使用该类型变量调用函数 , 也就是 pFun_add 类型 ;

// int (int, int) 函数指针类型重命名为 pFun_add
// 该类型变量可以直接接收 函数名 ( 函数地址 )
typedef int (*pFun_add)(int, int);

使用定义的 函数指针类型 调用函数 : 定义函数指针类型 pFun_add 的 变量 , 然后 将 add 函数地址 赋值给 该变量 , 然后 通过 函数指针变量 调用该函数 ;

	// 定义函数指针类型变量pFun_add pFun = add;fun(7, 8);




二、完整代码示例



代码示例 :

#include "iostream"
using namespace std; // int (int, int) 函数类型重命名为 func_add
// 使用时需要使用该类型的指针调用函数
typedef int fun_add(int, int);// int (int, int) 函数指针类型重命名为 pFun_add
// 该类型变量可以直接接收 函数名 ( 函数地址 )
typedef int (*pFun_add)(int, int);int add(int x, int y) {printf("x + y = %d\n", x + y);return x + y;
}int main() {// 1. 直接调用// 直接调用 add 函数 , 运行该函数// 函数名 add 就是函数地址add(1, 2);// 声明一个 int(int, int) 类型的指针变量// int(int, int) 类型 是 函数类型 // 该指针 指向 函数地址int(*p)(int, int) = add;// 通过函数指针调用 函数p(3, 4);// 定义函数指针类型变量fun_add* fun = add;fun(5, 6);// 定义函数指针类型变量pFun_add pFun = add;fun(7, 8);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行结果 :

x + y = 3
x + y = 7
x + y = 11
x + y = 15
Press any key to continue . . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/465806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【必看】Onlyfans如何使用搜索功能?Onlyfans如何搜索博主?如何在OnlyFans搜索HongkongDoll

1. 什么是Onlyfans OnlyFans是一种内容订阅服务平台,它成立于2016年。 它允许内容创作者在平台上面分享自己的创作,如图片、视频等等,用户需要支付订阅费用才能查看创作者的内容。此外,用户还可以通过打赏的方式来让创作者为自己…

一键打造属于自己漏扫系统

0x01 工具介绍 本系统是对Web中间件和Web框架进行自动化渗透的一个系统,根据扫描选项去自动化收集资产,然后进行POC扫描,POC扫描时会根据指纹选择POC插件去扫描,POC插件扫描用异步方式扫描.前端采用vue技术,后端采用python fastapi。 0x02 安装与使用 1、Docker部署环境 编译…

深入浅出CChart 每日一课——红花当然配绿叶,CChart辅助图形绘制

各位同学,好久不见,我可想死你们了!!!咦,那位不是巩叔吗?不好意思,侵权了,请多担待_。 前面的课程呢,拓展的内容比较多,最近笨笨想聚焦在CChart本…

【go语言】一个简单HTTP服务的例子

一、Go语言安装 Go语言(又称Golang)的安装过程相对简单,下面是在不同操作系统上安装Go语言的步骤: 在Windows上安装Go语言: 访问Go语言的官方网站(golang.org)或者使用国内镜像站点&#xff0…

数据结构:并查集讲解

并查集 1.并查集原理2.并查集实现3.并查集应用4.并查集的路径压缩 1.并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中…

leetcode链表相关题目

文章目录 1.移除链表元素方法1:方法2 2.合并两个有序链表3.链表的中间节点方法1方法2 4.反转单链表方法1方法2 5.分割链表6.链表中的倒数第k个节点方法1:方法2: 7.环形链表的约瑟夫问题8.链表的回文结构9.相交链表方法1方法2: 10.环形链表11.…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-软件定时器

目录 一、软件定时器基本概念二、软件定时器运行机制三、软件定时器状态四、软件定时器模式五、软件定时器开发流程六、软件定时器使用说明七、软件定时器接口八、代码分析(待续...) 一、软件定时器基本概念 软件定时器,是基于系统 Tick 时钟…

Win32 控制台绘图2

之前已经了解在控制台可以调用Win32 api绘图&#xff1b;下面继续加深一下此概念&#xff1b; #include <stdio.h> #include <stdlib.h> #include <windows.h>HWND WINAPI GetConsoleWindow();int main(int argc, char *argv[]) {HWND hwnd; HDC hdc; HPE…

VUE学习——事件处理

事件分为内联事件和方法事件。 我们可以使用【v-on】&#xff08;简写&#xff1a;&#xff09;来处理。 内联 <button v-on:click"count">按钮</button><button click"count">按钮</button><p>{{ count }}</p>方法

ZOJ 3537 Cake 【区间DP + 凸多边形三角剖分】

Cake 题意 给定平面坐标上的 n n n 个点&#xff0c;如果是凸多边形的话&#xff0c;就用最少的花费把这个多边形剖分成若干个三角形&#xff0c;剖分的线段端点只能是原多边形的顶点&#xff0c;一条线段的花费为&#xff1a; ∣ x i x j ∣ ∣ y i y j ∣ m o d p |x_i…

鸿蒙系统进一步学习(一):学习资料总结,少走弯路

随着鸿蒙Next的计划越来越近&#xff0c;笔者之前的鸿蒙系统扫盲系列中&#xff0c;有很多朋友给我留言&#xff0c;不同的角度的问了一些问题&#xff0c;我明显感觉到一点&#xff0c;那就是许多人参与鸿蒙开发&#xff0c;但是又不知道从哪里下手&#xff0c;因为资料太多&a…

Unity学习笔记(零基础到就业)|Chapter04:C#篇补充到Unity篇过渡

Unity学习笔记&#xff08;零基础到就业&#xff09;&#xff5c;Chapter02:C#篇补充到Unity篇过渡 前言C#总结补充1.值类型和引用类型有什么区别&#xff0c;他们在值的传递上分别有怎样的特性2.string是引用类型&#xff0c;但是他对外表现出值类型的特性&#xff0c;为什么&…