C++语法基础:函数指针

前言

"打牢基础,万事不愁" .C++的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.

引入

指针的一种,前一篇和指针相关的帖子C++基础语法:指针"进阶"---结点,双重指针-CSDN博客

函数指针的思想

既然属于指针的一种,他背后的设计思想也是指针的思想.

回顾指针

1>指针的值是内存地址,除了将指针值映射到硬件地址,其他情况下一般不关注指针的值

2>指针可以间接访问数据. 指针用于指向单个数据或者数据集合(数组或结点),指针一般指向数据集合,实现对集合元素的访问;指向单个数据时,多半用于需要修改传入的数据.

3>双重指针多用于指向指针数组.

函数指针的定义

首先,回顾函数的形式:

返回值类型 函数名(形参类型 形参)

每个函数的特征:返回值类型形参类型,这两样决定了函数的类型.

定义格式: typedef + 返回值类型+ (*函数指针名)+(形参类型,形参名)

举例

复制代码
#include<iostream>
typedef int (*pfi)(int i,int j);			//函数指针声明,定义新类型
int add(int i, int j);						//整数加法定义		
int add(int i, int j, int k);				//重载整数加法
int sub(int i, int j);						//整数减法定义
int apply(pfi pf, int i, int j);			//函数指针作为参数,可调用加法或者减法
int main(void) {
	pfi pa = add;							//函数指针变量指向指针常量(函数名)
	pfi ps = sub;							//函数指针变量指向指针常量(函数名)
	int result_add = apply(add, 1, 2);		//传入函数名add,调用加法函数	
	std::cout <<"传入函数名得到的加法结果是:" << result_add << std::endl;
	int result_adds = apply(pa, 1, 2);		//传入函数指针变量,调用加法函数	
	std::cout <<"传入函数指针得到的加法结果是:" << result_add << std::endl;
	int result_sub = apply(sub, 1, 2);		//传入函数名sub,调用减法函数	
	std::cout << "传入函数名得到的减法结果是:" << result_sub << std::endl;
	//以下报错,函数指针不能用于重载
//	int result_add = apply(add, 1, 2,3);	//传入函数名add,调用加法函数	
}

int add(int i, int j) {
	return i + j;
}int sub(int i, int j) {
	return i - j;
}
int apply(pfi pf, int i, int j) {
	int tmp=(*pf)(i, j);					//pf是指向pfi类型的函数指针,*pf表示函数
	return tmp;
}
int add(int i, int j,int k) {               //函数指针不能指向重载函数
	return i + j+k;
}

说明: 用一个其他的例子来比较,传入函数名相当于传入字面常量;

复制代码
int a=3;
int *p=&a;
show(3);                //相当于调用apply(add, 1, 2)
show(*a);               //相当于调用apply(pa, 1, 2) 
void show(int i){
    std::cout<<"你输入的数字是:"<<i<<endl;
}

相信看了这个例子,也不知道函数指针到底能干什么,直接用函数名调用函数不就行了吗?说实话,我也不知道函数指针的用途在哪里,估计暂时没找到适用场景.但既然设计出来总会有他的道理.

函数名是函数指针所指向的常量

其他

<<C++ Prime Plus>> 6th Edition上有个例子,指向函数指针的数组的指针,大意如下:

复制代码
	pfi par[] = { pa,ps };					//建立函数指针数组
	pfi* ppar = par;						//建立指向函数指针数组的指针
	pfi par1[] = { add,sub };				//建立函数指针数组
	pfi* ppar1 = par1;						//建立指向函数指针数组的指针

无论数组元素是什么类型,要建立指向数组的指针,都可以遵循这个基本思路:

数组元素类型+* 指针变量名=数组名

这里的数组元素是函数指针类型的元素,可以用函数名或者已赋值的指针变量

此外另一本书上讲了一个例子,把一个类的所有方法调出来用一遍,或许是函数指针真正的应用

相关推荐
yaoxin52112317 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫18 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp18 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的18 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉19 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉19 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
凡人叶枫19 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员19 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean19 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
LabVIEW开发20 小时前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview