news 2026/4/28 6:18:23

C++函数指针详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++函数指针详解

1. 获取函数的地址

2. 声明一个函数指针

3.使用函数指针来调用函数

获取函数指针:

函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名。

声明函数指针

声明指针时,必须指定指针指向的数据类型,同样,声明指向函数的指针时,必须指定指针指向的函数类型,这意味着声明应当指定函数的返回类型以及函数的参数列表。

例如:

1

2

3

doublecal(int);// prototype

double(*pf)(int);// 指针pf指向的函数, 输入参数为int,返回值为double

pf = cal;// 指针赋值

如果将指针作为函数的参数传递:

1

voidestimate(intlines,double(*pf)(int));// 函数指针作为参数传递

使用指针调用函数

1

2

3

doubley = cal(5);// 通过函数调用

doubley = (*pf)(5);// 通过指针调用 推荐的写法

doubley = pf(5);// 这样也对, 但是不推荐这样写

函数指针的使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#include <iostream>

#include <algorithm>

#include <cmath>

usingnamespacestd;

doublecal_m1(intlines)

{

return0.05 * lines;

}

doublecal_m2(intlines)

{

return0.5 * lines;

}

voidestimate(intline_num,double(*pf)(intlines))

{

cout <<"The "<< line_num <<" need time is: "<< (*pf)(line_num) << endl;

}

intmain(intargc,char*argv[])

{

intline_num = 10;

// 函数名就是指针,直接传入函数名

estimate(line_num, cal_m1);

estimate(line_num, cal_m2);

return0;

}

函数指针数组:

这部分非常有意思:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#include <iostream>

#include <algorithm>

#include <cmath>

usingnamespacestd;

// prototype 实质上三个函数的参数列表是等价的

constdouble* f1(constdoublearr[],intn);

constdouble* f2(constdouble[],int);

constdouble* f3(constdouble* ,int);

intmain(intargc,char*argv[])

{

doublea[3] = {12.1, 3.4, 4.5};

// 声明指针

constdouble* (*p1)(constdouble*,int) = f1;

cout <<"Pointer 1 : "<< p1(a, 3) <<" : "<< *(p1(a, 3)) << endl;

cout <<"Pointer 1 : "<< (*p1)(a, 3) <<" : "<< *((*p1)(a, 3)) << endl;

constdouble* (*parray[3])(constdouble*,int) = {f1, f2, f3};// 声明一个指针数组,存储三个函数的地址

cout <<"Pointer array : "<< parray[2](a, 3) <<" : "<< *(parray[2](a, 3)) << endl;

cout <<"Pointer array : "<< parray[2](a, 3) <<" : "<< *(parray[2](a, 3)) << endl;

cout <<"Pointer array : "<< (*parray[2])(a, 3) <<" : "<< *((*parray[2])(a, 3)) << endl;

return0;

}

constdouble* f1(constdoublearr[],intn)

{

returnarr;// 首地址

}

constdouble* f2(constdoublearr[],intn)

{

returnarr+1;

}

constdouble* f3(constdouble* arr,intn)

{

returnarr+2;

}

这里可以只用typedef来减少输入量:

1

2

3

4

typedefconstdouble* (*pf)(constdouble[],int);// 将pf定义为一个类型名称;

pf p1 = f1;

pf p2 = f2;

pf p3 = f3;

到此这篇关于C++函数指针详解的文章就介绍到这了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 6:16:29

基于Continue的AI代码审查自动化:从原理到CI/CD集成实践

1. 项目概述与核心价值最近在琢磨怎么把AI代码审查这事儿给整得更自动化、更靠谱一点&#xff0c;正好深度体验了一把Continue这个开源项目。简单来说&#xff0c;Continue是一个能让你把AI智能体&#xff08;Agent&#xff09;直接集成到代码仓库和CI/CD流程里的工具。它的核心…

作者头像 李华
网站建设 2026/4/28 6:07:20

Tkinter多标签页鼠标滚轮的完美解决方案

在使用Tkinter编写桌面应用程序时,常常会遇到一些看似简单的问题,比如让多标签页窗口支持鼠标滚轮滚动。今天我们来探讨一个常见的问题:如何使Tkinter的多标签页中的每个标签都能独立响应鼠标滚轮事件。 问题描述 用户报告的问题是,创建了一个多标签页的Tkinter窗口,其中…

作者头像 李华
网站建设 2026/4/28 6:03:08

比迪丽LoRA模型数据库集成案例:构建用户绘画历史与风格偏好系统

比迪丽LoRA模型数据库集成案例&#xff1a;构建用户绘画历史与风格偏好系统 你有没有想过&#xff0c;为什么那些顶级的绘画App总能猜到你喜欢的风格&#xff1f;你刚画了几张风景&#xff0c;它就给你推荐类似的笔刷和色彩&#xff1b;你偏爱赛博朋克&#xff0c;下次打开时&…

作者头像 李华
网站建设 2026/4/28 6:00:24

内容审核中的相似度比对实践:从接口调用到工程化落地

在做内容聚合/审核类项目时&#xff0c;经常遇到“文本是否重复/相似”的判断需求。自己实现一套相似度算法&#xff08;分词、向量化、编辑距离等&#xff09;成本不低&#xff0c;维护也麻烦。最近接入了一个现成接口&#xff0c;整体响应快、数据维度也够用&#xff0c;这里…

作者头像 李华
网站建设 2026/4/28 5:52:21

法语商业法律AI基准测试平台的设计与实践

1. 项目概述"Les-Audits-Affaires"是首个针对法语商业法律领域的综合性AI基准测试平台。作为一名长期关注法律科技领域的从业者&#xff0c;我亲眼见证了英语世界法律AI工具的蓬勃发展&#xff0c;而法语区在这一领域的标准化评估却长期处于空白状态。这个项目填补了…

作者头像 李华