C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 基础

    • C++ 基础 - 学习路线
    • C++ 基础 - 知识点
    • C++ 基础 - 面向对象
    • C++ 基础 - 语法糖
    • C++ 基础 - 关键字
    • C++ 基础 - 常用宏定义
    • C++ 基础 - 宏函数、内联函数、普通函数
  • 函数

    • C++ 函数 - 闭包
    • C++ 函数 - Linux系统调用Hook
    • C++ 函数 - getopt函数分析以及命令行解析
    • C++ 函数 - 函数指针及其应用
    • C++ 函数 - 作用域运算符::的使用
    • C++ 函数 - 智能指针shared_ptr的使用
    • C++ 函数 - struct结构体学习
    • C++ 函数 - typedef 语句的使用
    • C++ 函数 - va_list函数学习
  • 知识点

    • C++ 知识点 - 写时拷贝技术(copy-on-write)
    • C++ 知识点 - 前向声明(forward declaration)
    • C++ 知识点 - 头文件.h 和 源文件.cpp 以及多重定义(multiple definition)
    • C++ 知识点 - 为什么C语言不支持函数重载,C++又是如何支持的
    • C++ 知识点 - return 局部变量
    • C++ 知识点 - linux下c/cplusplus头文件和动态库的搜索
    • C++ 知识点 - 模板特化与偏特化
  • IO框架

    • C++ IO框架 - I/O 复用
    • C++ IO框架 - select 函数
    • C++ IO框架 - poll 函数
    • C++ IO框架 - epoll 函数
    • C++ IO框架 - Reactor 和 Proactor
  • 新版本特性

    • C++ 新版本特性 - C++11
    • C++ 新版本特性 - C++14
    • C++ 新版本特性 - C++17
    • C++ 新版本特性 - C++20

C++函数 - 函数指针及其应用

介绍C++函数指针的概念及其应用

  • 为何存在函数指针
  • 函数地址
  • 声明函数指针
  • 使用指针来调用函数
  • 使用typedef进行简化

为何存在函数指针

与数据项相似的是函数也有地址,一般情况下对用户来说没什么用,但是对于程序来说,用处比较大。

函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。

  • 例如:将另一个函数的地址作为一个函数的参数,这样第一个函数就能找到第二个函数并且运行它。虽然这种方式比起直接调用的方式比更加的笨拙,但是其允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。

补充:

指针函数和函数指针的区别

定义不同

  • 指针函数本质是一个函数,其返回值为指针。
  • 函数指针本质是一个指针,其指向一个函数。

写法不同

  • 指针函数:int* fun(int x,int y);
  • 函数指针:int (*fun)(int x,int y);

可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。

再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

指针函数示例:

#include<iostream>
#include<cstdio>
#include <cstring>

using namespace std;

/* 
 * 指针函数的定义 
 * 返回值是指针类型int * 
 */  
int *f(int a, int b) {  
    int *p = (int *)malloc(sizeof(int));  
    memset(p, 0, sizeof(int));  
    *p = a + b;    
    return p;  
} 

int main(){
	int *p = NULL;  
    p = f(1, 2);  
	cout<< p<<endl;//0x2166e70
	cout<< *p<<endl;//3
	return 0;
}

函数地址

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

声明函数指针

声明格式:类型说明符 (*函数名) (参数)

函数指针的声明:表明指定的函数返回类型、表明函数的特征标(参数列表)

注意:只有当一个函数的返回类型和参数列表和声明的函数指针的返回类型和参数列表一致的时候才可以进行传递,编译器拒绝这种赋值。

int sum(int a, int b);
 
int (*ptr)(int, int); // 声明函数指针ptr

ptr p1 = sum;    // 指针赋值

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

void result(int a, int b, int (*ptr)(int, int))

使用指针来调用函数

// 第一种方式
(*ptr)(4, 5);
// 第二种方式C++可用
ptr(4, 5);

使用typedef进行简化

定义一个函数指针,然后调用,输出结果:

#include<iostream>
#include<cstdio>

using namespace std;

int sum(int a, int b)
{
	return a+b;
}
 
int multiply(int a, int b)
{
	return a*b;
}
 
int main()
{
	typedef int (*ptr)(int, int);
	ptr p1 = sum;
	cout<< p1(4, 5)<< endl;
	p1 = multiply;
	cout<< p1(4, 5)<< endl;	
	
	return 0;		
}

将函数指针作为一个函数的形参然后输出,并且说明两种输出方式表达的结果一致:

#include<iostream>
#include<cstdio>

using namespace std;

int sum(int a, int b)
{
	return a+b;
}
 
int multiply(int a, int b)
{
	return a*b;
}
 
void result(int a, int b, int (*ptr)(int, int))
{
	cout<< ptr(a, b)<< endl;
	cout<< (*ptr)(a, b)<< endl;
}
 
int main()
{
	result(4, 5, sum);
	result(4, 5, multiply);
		
	return 0;		
}
Last Updated:
Contributors: klc407073648
Prev
C++ 函数 - getopt函数分析以及命令行解析
Next
C++ 函数 - 作用域运算符::的使用