C++]函数指针 ③ ( 函数指针语法 | 用函数名直接调用函数 | 定义函数指针变量 | 用 typedef 定义函数类型 | 用 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 . . .
上一篇: 函数指针和函数指针数组及其应用
推荐阅读
-
Qt QML VideoOutput 显示自定义的 YUV420P 数据流
-
用FFmpeg将YUV转换为JPEG并存储:图像处理基础(五)再探
-
用最简单的方法展示FFmpeg YUV420P图像拼接的示例
-
用NEON intrinsic实现RGB转YUV420SP(NV12)
-
10bit YUV(P010)的存储结构和处理-随着计算机处理信息的能力越来越厉害,这种能表现更高动态范围的图像存储格式将会逐渐成为主流,但是现在很多算法都不能直接处理 10bit 的 YUV ,都是先将其转换为 8bit YUV ,然后再进行处理,这实际上是丢弃了 10bit YUV 的图像高动态范围优势。 令人遗憾的是在渲染图像时,目前 OpenGL 也无法直接对 10bit YUV 进行渲染,也是需要先转换为 8bit YUV 。 接下来以一种常见的 10bit YUV (P010) 格式为例,介绍一下 10bit YUV 到 8bit YUV 的转换过程。 P010 最早是微软定义的格式,表示的是 YUV 4:2:0 的采样方式,也就是说 P010 表示的是一类 YUV 格式,它的内存排布方式可能是 NVNVYUYV12 。
-
C++实现:视频教程演示YUV420与RGB相互转换(第二部分)
-
入门级视音频数据处理:RGB、YUV像素数据处理的函数列表【转】
-
用简单易懂的方式指导你制作一款生成抖音风格动图的gif平台
-
使用腾讯云函数SCF快速解压对象存储COS中的ZIP文件
-
OpenCV-based Object Tracking in C++/Python (使用C++/Python进行基于OpenCV的目标追踪)