广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++函数指针深入探究
  • 141
分享到

C/C++函数指针深入探究

2024-04-02 19:04:59 141人浏览 安东尼
摘要

目录函数指针语法函数地址声明使用函数指针调用函数深入理解函数指针使用typedef 简化函数指针 为什么要使用函数指针? 调用的灵活性和通用性。 试想一下,我们在设计初期并不知道我们

函数指针

为什么要使用函数指针?

  • 调用的灵活性和通用性。

试想一下,我们在设计初期并不知道我们的函数的具体实现细节。例如,我们我们想要一个排序函数qsort,但是具体排序法则我们并不确定,是降序还是升序,采用什么算法都不清楚。这些问题是要在用户调用这个函数的时候才能够决定。于是调用者应该自己设计comparator函数,传给qsort函数。

例如我们设计一个结构体apple。我们除了设计出苹果的属性比如,数量、重量、颜色外,我们还要定义关于苹果的操作,比如,吃掉,种植,这时候我们可以使用函数指针。然后我们以后调用这个结构体的时候,可以采用a.eat(&b)的方式调用函数。

typedef struct apple{
    int number;
    double weight;
    colorType color;
    //some operations
    bool (*eat)(struct apple*);
    bool (*plant)(struct apple*);
}apple;

语法

函数地址

函数的地址实际上就是函数名。这一点可以类比于数组

声明

要声明指向特定类型的函数的指针,可以先编写这种函数的原型,然后用(*pf)代替函数名。或者采用c++11 的auto也能声明并初始化函数指针。

double pam (int);
//这是函数原型
double (*pf)(int);
//这是函数指针
auto pn=pam;
//定义并初始化函数指针

使用函数指针调用函数

double pam (int);
//这是函数原型
double (*pf)(int);
//这是函数指针
auto pn=pam;
//定义并初始化函数指针
pf=pam;
pam(4);
(*pf)(4);
(*pn)(4);

直接把函数地址(即函数名)赋值给函数指针就行了,注意特征标和返回类型必须相同。然后采用(*pf)(4)这样的方式调用函数。实际上,C++也允许这样子使用函数指针:

pf(4);//这种形式好看且实用,但是没有显示出 使用函数指针调用函数
pn(4);

深入理解函数指针

阅读这一篇幅,需要您熟练掌握,C语言中的指针。

//一些函数原型
const double* f1(const double ar[],int n);
const double* f2(const double *,int);
const double* f3(const double *,int);
//函数指针
const double* (*p1)(const double ar[],int n)=f1;
auto p2=f2;//感谢auto
//调用函数
cout<<(*p1)(av,3)<<*(*p1)(av,3);
cout<<p2(av,3)<<*p2(av,3);
//实际上 *p2(av,3)和*(*p2)(av,3)是一样的。不理解的看上面内容。
//包含3个函数指针的数组
const double* (*pa[3])(const double *,int)={f1,f2,f3};
//注意:
//1、[]优先级高于* 所以这是个数组不是指针。
//2、不能使用auto定义并初始化列表
auto pb=pa;
//既然已经声明了数组,数组名就是指针,采用auto可以定义初始化指针,这是合法的。
//调用函数
double x=*pa[0](av,3);
double y=*(*pb[1])(av,3);//由于[]优先级高于* 所以pb[1]是个函数指针。然后(*pb[1])就是调用函数了。
//更加深入
const double *(*(*pd)[3])(const double *,int) = &pa;
//首先把函数指针的壳子去掉即 const double *(* ···)(const double *,int),然后得到(*pd)[3]这里 pd先和* 结合 再和[]结合,所以pd是个指针,这个指针指向一个数组,这个数组的元素又是函数指针。
//是不是特别绕?
//感谢auto
auto pc=&pa;
//调用
(*pd)[0](av,3);
//pd是指向数组的指针,则(*pd)[0]就是数组的元素,数组的元素是函数指针,所以可以采用这种方式调用函数。
//或者采用  (*(*pd)[0])(av,3)调用函数也是等价的。
double z=*(*pd)[0](av,3);
//或者 采用 double z=*(*(*pd)[0])(av,3) 也是等价的

我们对于语法的了解不能仅仅潜于认识,对于这种const double *(*(*pd)[3])(const double *,int) = &pa; 我们不光要认识,更要会使用,再次重温一遍,我们想要一个指向数组的指针,这个数组里的元素是函数指针。

第一步,数组元素的类型是函数指针,所以壳子要有 const double *(* ···)(const double *,int)

第二步,指向数组的指针 (*pd)[3] ,由于[]比*优先级高,所以我们必须采用(),否则 *pd[3] 就是一个数组,数组的元素是指针。 第三步,结合得 const double *(*(*pd)[3])(const double *,int) = &pa

使用typedef 简化

typedef const double *(* p_fun)(const double *,int);
p_fun p1=f1;
p_fun pa[3]={f1,f2,f3};
p_fun (*pd)[3]=&pa;

typedef 使得代码量减少很多,而且更容易理解

到此这篇关于C/C++函数指针深入探究的文章就介绍到这了,更多相关C++函数指针内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C/C++函数指针深入探究

本文链接: https://www.lsjlt.com/news/165664.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++函数指针深入探究
    目录函数指针语法函数地址声明使用函数指针调用函数深入理解函数指针使用typedef 简化函数指针 为什么要使用函数指针? 调用的灵活性和通用性。 试想一下,我们在设计初期并不知道我们...
    99+
    2022-11-13
  • C语言指针和数组深入探究使用方法
    目录1、数组参数和指针参数1.1 一维数组传参1.2 一级指针传参1.3 二维数组参数和二级指针参数1.4 野指针的问题2、函数指针3、函数指针数组4、指向函数数组的指针5、回调函数...
    99+
    2022-11-13
    C语言指针和数组 C语言指针 C语言数组
  • C++深度探索虚函数指针示例
    代码描述:定义一个Person类为基类,ChinesePer 类与EnglishPer类都继承于此基类。 class Person { public: void speak() {...
    99+
    2022-12-19
    C++虚函数 C++虚函数指针
  • C语言深入探究函数的溯源
    目录一、函数的由来二、模块化程序设计三、C 语言中的模块化四、面向过程的程序设计五、声名和定义六、小结一、函数的由来 二、模块化程序设计 三、C 语言中的模块化 四、面向过程的...
    99+
    2022-11-13
  • C++深入探究用NULL来初始化空指针是否合适
    目录1.C++98中的空指针指针的危险性2.C++11中的空指针我们要了解C++11新特性的nullptr,我们很有必要先了解一下C++11之前的程序员是怎么使用空指针的。 1.C+...
    99+
    2022-11-13
  • C/C++多态深入探究原理
    目录多态虚表和虚表指针多态 面向对象编程有三大特性:继承、封装和多态。 其中,多态又分为编译时多态和运行时多态。编译多态是通过重载函数体现的,运行多态是通过虚函数体现的。 多态是如何...
    99+
    2022-11-13
  • C语言深入浅出分析函数指针
    我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("...
    99+
    2022-11-13
  • C++深入探究友元使用
    目录友元特点外部函数友元成员函数友元总结类友元友元 友元 friend 机制允许一个类授权其他的函数访问它的非公有成员. 友元声明以关键字 friend 开头 ,它只能出现在类的声明...
    99+
    2022-11-13
  • C/C++中指针的深入理解
    目录计算机的内存模型指针与指针常量指针变量和指针常量指针变量和数组函数指针C++中的引用传值还是传引用C++中的new关键词总结计算机的内存模型 CPU是计算机的核心部件,要想让一...
    99+
    2022-11-12
  • C++虚函数表深入研究
    目录探索虚函数表结构继承基类重写虚函数多基类继承 虚函数表寻找被覆盖的虚函数总结面向对象的编程语言有3大特性:封装、继承和多态。C++是面向对象的语言(与C语言主要区别),所以C++...
    99+
    2022-11-12
  • C++深入探究引用的使用
    目录一. 引用的概念二. 引用特性三. 常引用四. 使用场景1. 做参数2. 做返回值3. 做返回值需要注意的问题五. 传值传引用效率对比1. 值和引用传参时的效率比较2. 值和引用...
    99+
    2022-11-13
  • c++函数名指针和函数指针
    目录前言例 1例 2例 3前言 我们先来看一下函数指针式如何定义的,假如我们有一个函数int fun(int){…};那么他对应的函数指针写法就应该是int (*p)(...
    99+
    2022-11-13
  • C++深入探究类与对象之对象模型与this指针使用方法
    目录C++对象模型和this指针1 成员变量和成员函数分开存储2 this指针概念3 空指针访问成员函数4 const修饰成员函数C++面向对象的三大特性为:封装、继承、多态 C++...
    99+
    2022-11-13
  • 深入理解c++指针的指针和指针的引用
    在C++中,指针是一种数据类型,可以存储变量的内存地址。指针的指针和指针的引用是两种特殊的指针类型。指针的指针是指一个指针变量的值是另一个指针的地址。也就是说,指针的指针存储的是一个指针变量的地址。可以通过多次间接引用来获取最终指向的变...
    99+
    2023-08-09
    c++
  • 深入理解C#指针之美
    目录一、简洁优美的代码二、C# 指针基础三、几种常用用法1、使用Dispose模式管理非托管内存2、使用 stackalloc 在栈中分配内存3、模拟C中的union(联合...
    99+
    2022-11-12
  • 深入了解C语言指针
    目录指针是什么?指针和指针类型指针运算总结指针是什么? 总结:指针就是个变量,变量里面是地址,指针就是地址。(存放在指针的值都被当成地址处理)。 注:指针的大小在32位平台是4个字节...
    99+
    2022-11-12
  • C语言深入探究斐波那契数列
    目录一、递归思想二、空间换时间三、动态规划四、通项公式五、矩阵快速幂六、总结本文章参考leetcode斐波那契数官方题解 斐波那契的边界条件是 F(0)=0 和 F(1)=1。当 n...
    99+
    2022-11-13
  • C++数据结构深入探究栈与队列
    目录1. 栈1.1 栈的概念1.2 栈的实现2. 队列2.1 队列的概念2.2 队列的实现3. 栈和队列面试题3.1 括号匹配问题3.2用队列实现栈3.3 用栈实现队列3.4 设计循...
    99+
    2022-11-13
  • C++深入探究list的模拟实现
    目录迭代器正向迭代器类反向迭代器类push_back尾插函数push_front头插函数insert插入函数erase删除函数pop_front函数pop_back函数构造函数析构函...
    99+
    2022-11-13
  • C语言深入探究栈的原理
    栈 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 栈的实现 栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作