定义

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

int f(elementtype x);  //声明函数
int (*f1)(elementtype x); //声明函数指针
f1=f;//函数首地址赋值
f1=&f; //函数地址赋值

示例:(使用方法)

#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{int (*ptr)(int, int);int a, b, c;ptr = max;scanf("%d%d", &a, &b);c = (*ptr)(a,b);printf("a=%d, b=%d, max=%d", a, b, c);return 0;
}

作用

 个人感觉函数指针最大的作用就是作为函数的参数,当函数需要一个函数作为形参,而这个函数形参未定义或者不确定应该输入哪个函数时,函数指针的作用就体现出来了,使用地址传递的方式,利用函数指针作为形参可以很好地解决这个问题,这有利于程序的模块化与封装性例如:像二叉树遍历中使用的*visit()函数指针,我们并不清楚,visit应该是输出、操作、赋值等等哪一个函数,因此使用*visit函数指针,等实际输入时再确定它是哪一个函数。
template<class T>
void BinTree<T>::Preorder(BinTreeNode<T> *subtree,void (*visit)(BinTreeNode<T> *s)){if(subtree!=NULL){visit(subtree);Preorder(subtree->leftChild,visit);Preorder(subtree->rightChild,visit);}}
void printnode(BinTreeNode<char> *tnode){cout<<tnode->data<<' ';
}
int main(){BinTree<char> t;t.buildtree();t.Levelorder(printnode);t.Inorder(printnode);return 0;
}

函数指针模板

我们可以将printnode函数定义为模板函数

template<class T> void printnode(BinTreeNode<T> *tnode){cout<<tnode->data<<' ';
}

但如果在主函数里定义visit的函数指针模板, 直接如下所示

template<class T> void (*visit)(BinTreeNode<T> *tnode);

c++会报错,(原因我也不太清楚)

解决方法: 把函数指针封装在一个模板结构或模板类里,像在BinTree类中,我们定义一个模板函数指针就可以通过

template <class T>
struct Type {void (*visit)(BinTreeNode<T> *tnode);
};

或是放到一个模板函数内,让函数指针作为一个形参,在函数内再调用指针指向的函数,但这样也就没有特意定义它的必要,他也就像二叉树遍历函数中的用法一样,作为函数形参,不需要特别定义。

template <class T> void Func( void (*visit)(BinTreeNode<T> *tnode),BinTreeNode<T> *tnode) {printnode(BinTreeNode<T> *tnode);
}

函数指针的作用:*visit函数相关推荐

  1. 《C和指针》—— 第13章 函数指针的作用1:回调函数2(与模板结合,简化代码)

    注意:此为原创文章,未经同意,请勿随意转载. 目录 1. 问题与思路 2. 具体实现 3. 结果截图 1. 问题与思路 Q:实现一个与类型无关的比较函数,且考虑模板,精简代码 A:声明一个函数指针,函 ...

  2. C语言函数指针(结构体函数指针)

    文章目录 20211126 这篇讲得好 参考文章1:C语言函数指针(指向函数的指针)详解 函数指针的定义形式: returnType (*pointerName)(param list); 示例代码: ...

  3. 指针数组,数组指针,函数指针,函数指针数组 ,指向函数指针数组的指针

    首先有个问题:指针和数组有什么关系呢? 答案:什么关系都没有. 指针就是指针,在32位平台下,永远占4个字节,其值为某一个内存的地址. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其 ...

  4. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  5. C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

    文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...

  6. 详解函数指针和类成员函数指针

    作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...

  7. 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )

    文章目录 I . AAudio 音频流 采样 缓冲 播放 的连续机制 II . AAudio 音频流 数据回调函数 函数指针类型定义 III . AAudio 音频流 数据回调函数 实现 IV . A ...

  8. c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

    ↑↑↑ 点击上方公众号名称关注,不放过任何转变的机会. ✎ 编 者 悟 语 借口再小也会瓦解人的意志. 文 章 导 读 今天带大家用下函数指针,然后将函数指针和函数参数封装到结构体中,接着将数据用动态 ...

  9. 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)

    大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现.否则会出现一些意想不到的错误.话不多说,看下面的代码: int main() {int arr[10] = { 0 };/ ...

最新文章

  1. 如何理解导远技术手册
  2. 调用script方法_自己撸一个代码生成器输入参数和方法
  3. Windows Server 2008 使用WDS自动部署操作系统
  4. 项目编译失败_Swift源码编译让底层更清晰
  5. c语言键盘输入若干个数据,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  6. Java学习笔记——反射
  7. 设计模式之Factory
  8. 按键精灵_字符串提取
  9. 怎么用dos系统进入服务器,进入纯DOS系统的步骤分享
  10. 国家码信道顺从表(含数据库和配置)
  11. [Adaptive Autosar]深入理解--学习资料汇总
  12. AR/AP - 借项通知单和贷项通知单的区别
  13. php的rsa密匙长度,PHP解决RSA公私密钥换行处理
  14. cpu排行计算机专业,cpu性能天梯图,教您电脑cpu排行榜
  15. 【Linux】用进程控制知识做一个简易版shell
  16. ABAP推送企业微信机器人1-文本类型
  17. vue3.0 结合element ui 开发后台ui框架
  18. java 图像梯度检测_opencv学习笔记(六)---图像梯度
  19. webapp期末作业-oneapp
  20. IOS内存泄漏动静态方法排查

热门文章

  1. html 下拉图片列表,图片、表单、下拉选项
  2. lenovo3650M5安装win2008R2
  3. 热式气体质量流量计检定规程_最佳实践:热式质量流量计实际标定的安全性和准确性...
  4. MindMapper中如何添加父主题
  5. 常见 TCP 拥塞控制(避免)
  6. 怎样让你的软文更有说服力?四个办法帮你赢得用户信任
  7. A Game of Thrones(45)
  8. 哲理故事与管理之道 10 -你还在崇拜交付速度吗
  9. b2b电子商务研究报告
  10. Origin画甘特图