基础知识

函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。我们知道,函数的定义是存在于代码段,因此,每个函数在代码段中,也有着自己的入口地址,函数指针就是指向代码段中函数入口地址的指针。

函数指针的声明方法为:

返回值类型 ( * 指针变量名) ([形参列表]);

注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); /* 声明一个函数 */

int (*f) (int x); /* 声明一个函数指针 */

f=func; /* 将func函数的首地址赋给指针f */

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

注2:函数括号中的形参可有可无,视情况而定

但是直接这么一看感觉函数指针没有太多作用,与函数名直接调用函数也没有什么区别,何况函数名的底层也是使用函数指针来调用函数。我们来看有一段二叉树中序遍历非递归的代码来理解

Status InOrderTraverse( BiTree T, status (*visit)(TElemType e ))
{   InitStack( S );     p = T;while( p || !StackEmpty( S )){ if( p )// 根指针进栈,遍历左子树{   Push( S, p );p = p>pLChild;       }else // 根指针出栈,访问根结点,遍历右子树{    Pop( S, p );if( !(*Visit)( p->data))  return ERROR;p = p->pRChild;    // 右子树}// else       }// whilereturn OK;}// InOrderTraverse

其中作为形参的status (*visit)(TElemType e )这个函数指针 代表了访问节点的方法 这里使用函数指针的主要原因就是此时只是访问结点,但是不知道是打印或者是怎样的操作,而我们命名函数时的习惯是将名字起为函数的作用,但是这里不知道具体的访问的操作,因此写visit函数指针更加合理。所以,可以使代码的封装性和逻辑性更加合理。

还有一个作用就是可以将实现同一功能的很多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。或者归纳为:便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开

可以看下面对冒泡排序的封装,让整个代码的层次和模块化有了质的提升

#include<iostream>
using namespace std;
void sort(int arr[], int size, bool(*cmp)(int,int));
bool up(int a, int b);
bool down(int a, int b);
int main()
{int arr[10];for (int i = 0;i < 10;++i)cin >> arr[i];sort(arr, 10,down);for (int i = 0;i < 10;++i)cout << arr[i] << " ";return 0;
}
void sort(int arr[],int size,bool(*cmp)(int,int))//简单冒泡排序
{int temp;for (int i = 0;i < size-1; ++i){for (int j = i;j < size-1;++j){if (cmp(arr[i], arr[j + 1])){temp = arr[i];arr[i] = arr[j + 1];arr[j + 1] = temp;}}}
}
bool up(int a, int b)
{if (a > b)return 1;elsereturn 0;
}
bool down(int a, int b)
{if (a > b)return 0;elsereturn 1;
}

(*visit)(TElemType e )函数指针理解相关推荐

  1. C语言工作笔记-对函数指针的进一步认识(与回调函数结合使用,并且对比C++的回调)

    目录 背景和基本概念(含与C++回调对比) 函数指针最一般的用法 函数指针结合回调 源码打包 背景和基本概念(含与C++回调对比) 毕业也有10个月了,加上实习已经工作14个月了,感觉这一年多的板砖生 ...

  2. 改善C++ 程序的150个建议学习之建议8:拒绝晦涩难懂的函数指针

    建议8:拒绝晦涩难懂的函数指针 在C/C++程序中,数据指针是最直接也是最常用的,理解起来也相对简单容易,但是函数指针理解起来却并不轻松.函数指针在运行时的动态调用中应用广泛,是一种常见而有效的手段. ...

  3. c语言visit函数指针,C++中的函数指针总结

    1.函数指针的引出 假设我们需要写个函数 sort( start, end, compare ); 对start 和end 之间的数组元素进行排序compare 定义了比较数组中两个字符串的比较操作. ...

  4. c语言函数指针的理解与使用(学习)

    1.函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: 1 2 3 A) char * (*fun1)(char * p1,char * p2); B) char  ...

  5. visual c++ 6.0原版_C/C++编程笔记:C语言函数指针的理解与使用,就是这么简单明了!...

    1.函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型 ...

  6. 对函数指针与typedef的理解:typedef void (*sighandler_t)(int)

    文章目录 缘由 解释函数指针int (\*f)(int*); 解释typedef void(*sighandler_t)(int) 缘由 2021年9月22日在刷CS:APP的时候,邂逅了一种函数指针 ...

  7. 深入理解C/C++函数指针

      函数指针数组的妙用 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批 ...

  8. 理解复杂的C/C++声明 const, typedef , 函数指针(转贴)

    让我们从一个非常简单的例子开始,如下: int n; 这个应该被理解为"declare n as an int"(n是一个int型的变量). 接下去来看一下指针变量,如下: int ...

  9. C语言基础(三):函数名、函数指针、指针函数的理解

    函数指针 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址.而且函数名表示的就是这个地址.既然是地址我们就可以定义一个指针变量来存 ...

最新文章

  1. 【python教程入门学习】Python实现自动玩贪吃蛇程序
  2. 谷歌母公司投资成绩:4大机构各有侧重,投资2个马斯克项目
  3. RocketMQ CommitLog And Index
  4. 树莓派 使用读卡器修改WIFI连接配置
  5. Scala多线程:使用Executors提交Callable任务代码示例
  6. SAP CRM HANA report模型的数据库存储表
  7. libsvm java 调用说明
  8. 任何项目都适用的CMakeLists配置
  9. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2 1 4
  10. linux下的网桥介绍
  11. zookeeper无法启动的原因定位
  12. centos6.5 mysql5.6主从复制
  13. matlab波浪力的数值模拟,【干货】二维波浪水槽以及波浪传播变形的数值模拟(附详细步骤)...
  14. 安卓Autojs逆向破解必备基础smail基础语法
  15. 快狗打车上市:市值超130亿港元 姚劲波与陈小华收获IPO
  16. android面试题之四(红黑联盟)
  17. 支付宝 客户端 Android 集成流程
  18. 使用Java的Graphics类进行绘图
  19. 狂神Docker通俗易懂学习笔记2
  20. 众里寻她千百度,wordperss 热键

热门文章

  1. 中国历史上的著名武将有哪些?
  2. 物联卡流量虚吗?说虚的说明你被骗了!
  3. Redis设计与实现学习记录《一》
  4. 计算机黑屏跳横杠,电脑开机时黑屏左上角显示一个横杠是怎么回事
  5. 如何在产品功能维度评价APP
  6. 欧洲哲学发展趋势与中国哲学的机遇
  7. Python数据分析练习:北京、广州PM2.5空气质量分析(2)
  8. [FAQ21007] 电信VoLTE开关默认值设置
  9. soj2093: Farmer John
  10. protues VSM 图形仿真帮助