C++函数指针详解

 更新时间:2021年06月25日 15:27:21   作者:途径北海道  
这篇文章主要介绍了C++函数指针详解,通过文字描述C++函数指针基础概念,内涵详细的代码实现和解析,希望对你能够有所帮助

函数指针基础:

1. 获取函数的地址

2. 声明一个函数指针

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

获取函数指针:

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

声明函数指针

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

例如:

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

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

void estimate(int lines, double (*pf)(int));  // 函数指针作为参数传递

使用指针调用函数

double y = cal(5);   // 通过函数调用
double y = (*pf)(5);   // 通过指针调用 推荐的写法 
double y = pf(5);     // 这样也对, 但是不推荐这样写

函数指针的使用:

#include <iostream>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
double cal_m1(int lines)
{
	return 0.05 * lines;
} 
 
double cal_m2(int lines)
{
	return 0.5 * lines;
}
 
void estimate(int line_num, double (*pf)(int lines))
{
	cout << "The " << line_num << " need time is: " << (*pf)(line_num) << endl; 
}
 
 
 
int main(int argc, char *argv[])
{
	int line_num = 10;
	// 函数名就是指针,直接传入函数名
	estimate(line_num, cal_m1);
	estimate(line_num, cal_m2); 
	return 0;
}

函数指针数组:

这部分非常有意思:

#include <iostream>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
// prototype   实质上三个函数的参数列表是等价的 
const double* f1(const double arr[], int n);
const double* f2(const double [], int);
const double* f3(const double* , int);
 
 
 
int main(int argc, char *argv[])
{
	double a[3] = {12.1, 3.4, 4.5};
	
	// 声明指针
	const double* (*p1)(const double*, int) = f1;
	cout << "Pointer 1 : " << p1(a, 3) << " : " << *(p1(a, 3)) << endl;
	cout << "Pointer 1 : " << (*p1)(a, 3) << " : " << *((*p1)(a, 3)) << endl;
	
	const double* (*parray[3])(const double *, 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;
    
	return 0;
}
 
 
const double* f1(const double arr[], int n)
{
	return arr;     // 首地址 
} 
 
const double* f2(const double arr[], int n)
{
	return arr+1;
}
 
const double* f3(const double* arr, int n)
{
	return arr+2;
}

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

typedef const double* (*pf)(const double [], int);  // 将pf定义为一个类型名称;
pf p1 = f1;
pf p2 = f2;
pf p3 = f3;

到此这篇关于C++函数指针详解的文章就介绍到这了,更多相关C++函数指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++快速排序超详细讲解

    C++快速排序超详细讲解

    快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下
    2025-03-03
  • C++函数重载详解及实例代码

    C++函数重载详解及实例代码

    这篇文章主要介绍了C++函数重载详解及实例代码的相关资料,需要的朋友可以参考下
    2016-09-09
  • 详解C++ sizeof(上)

    详解C++ sizeof(上)

    这篇文章主要介绍了C++ sizeof的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • 详解QT使用http通信的同步和异步

    详解QT使用http通信的同步和异步

    在Qt与Http通信的时候,会根据不同的情况使用同步或者异步的方式进行数据请求,下面我们就来深入了解一下http通信的同步和异步的相关知识,感兴趣的小伙伴可以了解下
    2023-12-12
  • C++日期和时间编程小结

    C++日期和时间编程小结

    这篇文章主要介绍了C++日期和时间编程小结的相关资料,需要的朋友可以参考下
    2022-12-12
  • C++ Boost.Signals2信号/槽概念

    C++ Boost.Signals2信号/槽概念

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12
  • 枚举和宏的区别详细解析

    枚举和宏的区别详细解析

    枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符
    2013-09-09
  • 关于C语言中数据在内存中的存储详解

    关于C语言中数据在内存中的存储详解

    这篇文章主要给大家介绍了关于C语言中数据在内存中的存储的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用用C++做一颗会跳动的爱心实例代码

    使用用C++做一颗会跳动的爱心实例代码

    大家好,本篇文章主要讲的是使用用C++做一颗会跳动的爱心实例代码,感兴趣的同学赶快来看一看吧,欢迎借鉴学习C++做一颗会跳动的爱心实例代码
    2021-12-12
  • C语言代码实现学生成绩管理系统

    C语言代码实现学生成绩管理系统

    这篇文章主要为大家详细介绍了C语言代码实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论