转载自:https://www.cnblogs.com/yangjiquan/p/11465376.html

首先说一下指针函数:

1.指针函数的定义

顾名思义,指针函数即返回指针的函数。其一般定义形式如下:

类型名 *函数名(函数参数表列);

其中,后缀运算符括号"()"表示这是一个函数,其前缀运算符星号"*"表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个"指向返回值为…的指针(地址),"类型名"表示函数返回的指针指向的类型"。

"(函数参数表列)"中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:

 int *pfun(int, int);

由于"*"的优先级低于"()"的优先级,因而pfun首先和后面的"()"结合,也就意味着,pfun是一个函数。即:

int *(pfun(int, int));

接着再和前面的"*"结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。

我们不妨来再看一看,指针函数与函数指针有什么区别?

int (*pfun)(int, int);

通过括号强行将pfun首先与"*"结合,也就意味着,pfun是一个指针,接着与后面的"()"结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。

虽然它们只有一个括号的差别,但是表示的意义却截然不同。函数指针的本身是一个指针,指针指向的是一个函数。指针函数的本身是一个函数,其函数的返回值是一个指针。

2.    用函数指针作为函数的返回值

在上面提到的指针函数里面,有这样一类函数,它们也返回指针型数据(地址),但是这个指针不是指向int、char之类的基本类型,而是指向函数。对于初学者,别说写出这样的函数声明,就是看到这样的写法也是一头雾水。比如,下面的语句:

int (*ff(int))(int *, int);

我们用上面介绍的方法分析一下,ff首先与后面的"()"结合,即:

int (*(ff(int)))(int *, int);   // 用括号将ff(int)再括起来

也就意味着,ff是一个函数。

接着与前面的"*"结合,说明ff函数的返回值是一个指针。然后再与后面的"()"结合,也就是说,该指针指向的是一个函数。

这种写法确实让人非常难懂,以至于一些初学者产生误解,认为写出别人看不懂的代码才能显示自己水平高。而事实上恰好相反,能否写出通俗易懂的代码是衡量程序员是否优秀的标准。一般来说,用typedef关键字会使该声明更简单易懂。在前面我们已经见过:

int (*PF)(int *, int);

也就是说,PF是一个函数指针"变量"。当使用typedef声明后,则PF就成为了一个函数指针"类型",即:

typedef int (*PF)(int *, int);

这样就定义了返回值的类型。然后,再用PF作为返回值来声明函数:

PF ff(int);

指针函数到函数指针作为函数的返回值相关推荐

  1. MATLAB中如何忽略函数中前几个不需要的返回值而只取需要的返回值,例如:只取函数第二个返回值,而忽略第一个返回值

    1 致谢 感谢网友honglei.chen的回答, 原文链接如下: https://www.ilovematlab.cn/thread-203269-1-1.html 2 前言 今天在学习神经网络算法 ...

  2. C语言基础入门48篇_20_函数入门:为什么使用函数?(函数使得程序模块化 使用函数封装细节,使得程序员只要面向函数的接口编程(参数与返回值),而不用关心函数内部细节)

    菜鸟和高手都会基本,那菜鸟为什么是菜鸟,高手为什么是高手呢?很大的区别在于,高手写的程序[结构性]更好,更容易维护.而函数就是C语言结构化的一种手段. 函数可以将大的计算任务划分为多个较小的任务(解耦 ...

  3. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值

    原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; } 1 ...

  4. Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  5. 使用钩子函数[4] - 钩子链和 CallNextHookEx 的返回值

    SetWindowsHookEx 函数的第一个参数表示钩子类型, 共有 14 种选择, 前面我们已经用过两种: WH_KEYBOARD.WH_MOUSE. 系统会为每一种类型的钩子建立一个表(那就是 ...

  6. Mysql函数示例(如何定义输入变量与返回值)

    Mysql 函数示例 简介 基于mysql实现函数的编写,如何定义输入变量,如何定义和使用返回值等. 获取男女信息 --1 获取男女信息 CREATE FUNCTION getGender(idcar ...

  7. python冒号声明类型_Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释...

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  8. python学习之路---函数:定义def、调用、返回值return、参数说明、参数陷阱

    #函数 #可读性强,复用性强 #函数定义:定义了之后,可以在任何需要的地方调用 #格式: def 函数名(): 例子:def mylen(): # 没有返回长度,只能单纯的打印 # return 返回 ...

  9. js错误集锦 函数在一个map循环遍历中进行返回值返回 结果在调用该函数时收不到返回值

    错误代码: superviseFilter = () => {let company = this.props.cooperativeState.allCompanyif(this.state. ...

  10. python调用自定义函数返回值的类型_生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)...

    工具:VS2010    python2.7 (若使用的python是64位的,生成的dll也要使用x64) 系统:win7pro 64bit 首先,dll工程的创建以及dll文件的生成: new p ...

最新文章

  1. 小米输掉官司,倒打一耙不如坦然认错
  2. php 静态方法继承,php 5.2中的类继承:重写扩展类中的静态变量?
  3. [转] 《完美程式设计指南》Effective Delphi
  4. html动画效果结束返回,javascript判断css3动画结束 css3动画结束的回调函数
  5. C语言学习笔记(1)--基本概念和函数用法
  6. Android Studio 在res中新建文件夹不显示
  7. PyTorch 1.2 中文文档校对活动 | ApacheCN
  8. DisplayX显示器测试、显示器屏幕检测
  9. 【三维路径规划】基于matlab A_star算法机器人栅格地图三维路径规划【含Matlab源码 190期】
  10. 正态分布是离散分布还是连续分布_简单统计学|正态分布之连续数据的概率分布...
  11. Unity - Timeline 之 Timeline window(Timeline窗口)
  12. python模型保存与恢复_tensorflow1.0学习之模型的保存与恢复(Saver)
  13. (六十二)基于logistic回归的信用评级和分类模型评估
  14. Python下载网易云音乐(云音乐飙升榜)
  15. expected 3 got 2 错误提示
  16. sys.path.append方法
  17. 【服务器数据恢复】服务器卷被误删除的raid5数据恢复案例
  18. FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)
  19. java程序员从笨鸟到菜鸟_Java程序员从笨鸟到菜鸟之(十四)Html基础积累总结(上)...
  20. 区块链量化投资系列课程(4) - 动态平衡策略

热门文章

  1. sublime解决乱码问题
  2. bitwarden密码管理和搭建服务说明
  3. 计算机二手配件,电脑二手零件那些值得买,哪些不值得买?买二手零件要注意些啥?...
  4. 新闻类应用后台耗电大调查!哪个应用最省电?
  5. docker简介和安装(阿里云加速)以及Springboot项目部署docker,实现局域网下同时访问项目(详细过程)
  6. windows 查看端口 进程
  7. ILRuntime 使用教程
  8. 计算机电脑操作员培训计划,计算机操作员培训计划..doc
  9. mate拆机换屏教程
  10. kafka java jvm 优化_kafka优化–JVM参数配置优化