广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中函数指针有什么用
  • 532
分享到

C++中函数指针有什么用

2023-06-25 15:06:39 532人浏览 泡泡鱼
摘要

这篇文章主要为大家展示了“c++中函数指针有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中函数指针有什么用”这篇文章吧。1、函数指针函数指针顾名思义,就是指向函数的指针。和数据类似

这篇文章主要为大家展示了“c++中函数指针有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中函数指针有什么用”这篇文章吧。

1、函数指针

函数指针顾名思义,就是指向函数的指针。

和数据类似,C++当中函数也有地址,函数的地址是存储函数机器语言代码的内存地址。我们可以将另外一个函数的地址作为参数传入函数,从而实现函数的灵活调用。

1.1 获取函数地址

获取函数地址的方法非常简单,只要使用函数名(后面不跟参数和括号)即可。比如我们有一个函数叫做think,那么think()是调用函数拿到结果,而think则是获取函数的地址。

如果我们想要将think函数当做参数传入另外一个函数,我们可以这么写:

func(think);

1.2 声明函数指针

声明函数指针和声明函数类似,我们声明一个函数可以这么写:

double process(int);

而我们声明函数指针则可以写成这样:

double (*pt)(int);

如果我们把(*pt)替换成函数名的话,这其实就是一个函数的声明。如果(*pt)是函数的话,那么pt自然就是指向函数的指针了。

1.3 函数指针传参

如果我们要实现一个函数,它的一个参数是一个函数指针,它的写法和刚才一样:

double func(double x, double (*pt)(int));

在这个声明当中,它的第二个参数是一个函数指针。指向的函数接收一个int参数,返回一个double结果。

1.4 调用函数

最后, 我们来看下通过指针调用函数的部分。

其实也非常简单,因为我们前面说了(*pt)的效果和函数是一样的,我们之前通过函数名调用函数,那么我们只需要改成通过(*pt)调用即可。

如:

double process(int);double (*pt)(int);pt = process;cout << (*pt)(5) << endl;

2、函数指针进阶

简单的函数指针比较简单,但对于复杂的情况则显得有些恐怖。下面我们来看下C++ primer当中提供的一些例子:

const double* f1(const double ar[], int n);const double* f2(const double [], int);const double* f3(const double *, int);

这三个函数看起来长得不一样,但其实是等价的。因为在函数参数列表当中,数组和指针是等价的。其次我们可以在函数的原型中省略掉变量名,因此const double ar[]可以简化成const double [] ,也可以写成const double *。

有了这三个函数之后,假设我们要声明一个指针,指向这三个函数。根据我们前文当中说过的,可以将函数名替换成(*pt)来实现:

const double* (*pt)(const double *, int) = f1;

其实这个语句看起来就有些复杂了,整个语句的可读性很差。如果不是知道这里用的是一个函数指针,乍一看想要看明白估计不太容易。我们可以分成两个部分来理解,其中const double *是一个整体,表示函数的返回值类型是一个const double *也就是一个常量浮点数的地址。其次(*pt)是一个整体,代替了函数名,表示这是一个指向函数的指针。

在C++11当中提供了叫做auto的新特性,它可以帮助变量自动识别对应的类型,可以解决一些类型特别复杂的问题,比如:

auto p2 = f2;

函数指针有两种调用方法,除了可以使用(*p2)的方式调用之外,

也可以直接使用名称调用:

const double* x = p2(ar, 3);const double* y = (*p2)(ar, 3);

显然前者更好,更清楚。这里其实有一个疑问,为什么这两种方式都可以执行呢?这是因为当我们执行auto p2 = f2的时候,其实是执行的auto p2 = &f2 C++会隐式地将函数转换成函数的地址。因为函数的值本身就是一个地址,所以这两种方式才都能正确地运行。

问题还没有结束,假如我们要定义一个指向函数的指针数组呢?这应该怎么声明?

也就是const double* (*pt)(const double *, int)这样一个类型的数组,它应该怎么声明,这个方括号应该放在那里?

正确答案是放在括号里:

const double* (*pt[3])(const double *, int);

因为运算符[]的优先级高于*,因此*pt[3]表示pt是一个长度为3的指针数组。其他的内容表明了该指针的类型。

由于我们定义的是一个数组,所以这里不能使用auto,因为自动类型推断只能用于单值初始化而不能用于初始化列表。

到这里还没结束,还有更恐怖的,如果我们想要定义一个指向这个数组的指针,应该怎么办呢?如果使用auto可以写成:

auto ptr = &pt;

如果不使用auto呢?首先我们可以想到,这个声明是基于pt的,我们需要在pt的声明上加上一个*,但问题是加在哪里呢?

进一步分析,会发现我们需要指出这是一个指针,而不是数组。意味着核心的部分应该写成(*ptr)[3],表示这是一个指向长度为3的数组的指针。因为[]的优先级更高,所以需要使用括号。如果写成*ptr[3]表示这是长度为3的指针数组。

我们进一步倒推,(*ptr)[3]这个数组当中的元素是什么类型呢?是指向函数的指针,所以写出来结果是这样:

const double *(*(*ptr)[3])(const double*, int) = &pt;

很明显,这样的定义非常非常的难以理解。而且这还不是最复杂的情况,比如函数的返回类型又是一个指向一个函数的指针……明摆着告诉我们含义我们仍然要推敲一会,如果在一段不明的代码当中遇到,可能会直接抓狂吧……

也正因此,C++11当中推出了auto特性,可以简化这种情况。

多说一句题外话,golang语言当中将变量的类型放在变量的后面而不是前面,其中一个原因就是为了解决类似情况的复杂性。

如果是golang来定义同样的内容,会是这样的:

func f2(arr []float64, n int) *float64 {    // todo}// 函数指针var p1 func([]float64, int) *float64 = f2;// 函数指针数组var pt [3]func([]float64, int) *float64;// 函数指针数组的指针var ptr *[3]func([]float64, int) *float64 = &pt;

很明显,虽然变量类型写在变量后面刚开始会不太习惯,但是很明显这样要清晰很多。

以上是“C++中函数指针有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C++中函数指针有什么用

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

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

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

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

下载Word文档
猜你喜欢
  • C++中函数指针有什么用
    这篇文章主要为大家展示了“C++中函数指针有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中函数指针有什么用”这篇文章吧。1、函数指针函数指针顾名思义,就是指向函数的指针。和数据类似...
    99+
    2023-06-25
  • C语言中怎么使用指针函数和函数指针
    本篇内容介绍了“C语言中怎么使用指针函数和函数指针”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、指针函数当一个函数声明其返回值为一个指针...
    99+
    2023-06-16
  • C语言中如何使用指针函数和函数指针
    这篇文章给大家介绍C语言中如何使用指针函数和函数指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、指针函数当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。格式:...
    99+
    2023-06-17
  • c++函数名指针和函数指针怎么定义
    本文小编为大家详细介绍“c++函数名指针和函数指针怎么定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“c++函数名指针和函数指针怎么定义”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言我们先来看一下函数指针...
    99+
    2023-06-29
  • C++函数指针,对象指针,this指针,指向类静态怎么用
    这篇文章主要介绍了C++函数指针,对象指针,this指针,指向类静态怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数指针,对象指针,this指针,指向类静态怎么用文章都会有所收获,下面我们一起来看...
    99+
    2023-06-29
  • C++函数指针的用法有哪些
    这篇“C++函数指针的用法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++函数指针的用法有哪些”文章吧。C++函数...
    99+
    2023-06-26
  • C++中的this指针有什么用
    这篇文章主要介绍“C++中的this指针有什么用”,在日常操作中,相信很多人在C++中的this指针有什么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++中的this指针有什么用”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • C语言中指针有什么用
    这篇文章主要介绍C语言中指针有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!(壹)  敢问指针为何物 1.1  指针的概念在计算机科学中,指针(Pointer)是编程语言中的一个对...
    99+
    2023-06-29
  • C语言函数指针怎么用
    这篇文章主要介绍“C语言函数指针怎么用”,在日常操作中,相信很多人在C语言函数指针怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言函数指针怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!定义...
    99+
    2023-06-22
  • python高阶函数和C语言函数指针有什么区别
    本篇内容主要讲解“python高阶函数和C语言函数指针有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python高阶函数和C语言函数指针有什么区别”吧!python高阶函数:将函数作为...
    99+
    2023-06-04
  • c语言指针数组和数组指针有什么区别
    C语言中,指针数组和数组指针是两种不同的概念。 指针数组(Pointer Array):指针数组是一个数组,其中的元素都是指针类型...
    99+
    2023-10-27
    c语言
  • C语言数组指针和指针数组有什么区别
    这篇文章主要讲解了“C语言数组指针和指针数组有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数组指针和指针数组有什么区别”吧!区别:指针数组本身是一个数组,数组的元素都是指针,...
    99+
    2023-06-20
  • C语言如何使用数组指针与函数指针
    这篇文章主要为大家展示了“C语言如何使用数组指针与函数指针”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何使用数组指针与函数指针”这篇文章吧。函数指针语法定义一个函数指针,并通过函数指针...
    99+
    2023-06-29
  • C语言中指针有什么作用
    这篇“C语言中指针有什么作用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中指针有什么作用”文章吧。一、内存本质编程的...
    99+
    2023-06-08
  • C++普通函数指针怎么使用
    本篇内容介绍了“C++普通函数指针怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进行C++编写程序时,你经常需要在一个函数中调用其他...
    99+
    2023-06-17
  • c语言指针在函数中怎么使用
    在C语言中,指针在函数中的使用有以下几种方式:1. 将指针作为函数参数传递:可以将指针作为函数的参数传递给函数,这样函数内部就可以通...
    99+
    2023-10-20
    c语言
  • C++函数指针的用法详解
    目录C++函数指针详细理解函数指针初识函数指针作为形参使用函数指针作为返回值练习总结C++函数指针详细理解 函数指针初识 函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作...
    99+
    2022-11-12
  • C++中如何使用成员函数指针
    C++中如何使用成员函数指针,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一个成员函数的指针指向类中的一个成员函数,并和以前有相同的参数,声明如下:float (...
    99+
    2023-06-17
  • c语言指针有什么作用
    C语言指针是一种特殊的变量类型,用于存储内存地址。它们的作用包括:1. 动态内存分配:指针可以用于动态地分配内存,以便在程序运行时创...
    99+
    2023-09-14
    c语言
  • C++11空指针有什么作用
    本篇内容主要讲解“C++11空指针有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11空指针有什么作用”吧!以前什么样在C语言中,使用NULL来初始化空指针。char* pch =...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作