浅谈c++之指针型函数与函数指针

2024-02-01 16:18

本文主要是介绍浅谈c++之指针型函数与函数指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  对于初入C/C++殿堂的人来说,当听到指针型函数与函数指针两个名词时有可能会在潜意思中认为,他们是同一个东西。但是事实并非如此。


  函数指针与指针函数他们其实是两个不同的东西,对于函数的表达形式我们知道是:
  返回类型 函数名(参数); 这一种表达形式,比如现在定义一个函数,其形式如下:

int max(int a, int b);                        //1-1

  从上方的形式可以得到这是一个返回类型为 int型 函数名为 max 函数的参数有两个,并且其类型都是 int型 这时候如果在函数名字的前面加上 ” * ” 这个符号,得到的形式如下:

int* max(int a, int b);                       //1-2

  表达式1-1与表达式1-2进行对比后发现,表达式1-2比表达式1-1多了一个“ * ”,但是他们的意义却完全不同,函数表达式1-2得到的是一个函数名为max,其含有两个参数,参数类型都是int型,但是其返回类型不再是int型而是一个int*(即:函数max的返回类型为一个指向int型的指针。对于1-2所述的表达式就是一个指针型函数。


  如果将 “ * ” 与函数名max在一起,并且用“()”阔起来,然后变成如下方1-3所示:

int (* M)(int , int );                 //1-3

  相信大家已经想到了这种就是函数指针(指向函数的指针),从1-3的表达形式可以看出,从右往左分析,右边的括号里面有两个int型的数据类型,数据类型的左边又是一个括号,则说明右边的()里面其实是函数的参数,左边的括号(*M)表示这个函数是一个函数指针,即1-3表达的是:M是一个指向int返回类型,含有两个int型参数的函数指针。


  下面对于指针“ * ”在函数中使用时做进一步的介绍:

float(*f)(); //表示f是一个指向返回类型为float型的函数的指针

  此时将上式中的f和;号去掉后

float(*)())  //这个表达式是一个类型,即“指向返回型为float型的函数的指针”,如果用这个类型去修饰一个变量名,我们就叫他类型转换符

  下面结合我之前遇到的一种很经典的表达表达形式:

void (*b[10])(void(*)());

  首先,表达式的后半部分被两个()分开,其中(b[10])容易知道b是一个有10个元素的数组,它的每一个元素都是一个指针。后面的一个()为(void()())其中没有出现变量名,所以他代表一个类型,即指向返回值为void型的函数的指针,但是通常类型修饰符都是出现在变量名的左边,而在整个表达式中这个类型符是在变量名左边,所以(void(*)())的最外层的(),表示定义了一个函数,这个函数有一个参数(就是一个指针————指向返回值为void类型的函数的指针)。
  通过上述的分析可以得到b数组里面,每一个指针元素都是一个函数指针,这个函数有一个参数,这个参数是一个函数指针。整个表达式的最左边void,则定义了b数组中函数指针所指向函数的返回值类型。
在面对
void (b[10])(void()());时,可以通过引入typedef来起别名,对其进行简化。

void (*b[10])(void(*)());
typedef void(*func)();//即表示类型func是一个函数指针,然后针对整个表达式申明一个类型:
typedef void(*fun)(func);//即表示,类型fun,是一个函数指针。此函数的参数类型为func
fun b[10];//最后进行变量申明

  这样,看起来会比较清晰。

这篇关于浅谈c++之指针型函数与函数指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667767

相关文章

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命