指针函数到函数指针作为函数的返回值

指针函数到函数指针作为函数的返回值转载自:https://www.cnblogs.com/yangjiquan/p/11465376.html首先说一下指针函数:1.指针函数的定义顾名思义,指针函数即返回指针的函数。其一般定义形式如下:类型名*函数名(函数参数表列);其中,后缀运算符括号”()”表示这是一个函数,其前缀运算符星号”*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个”指向返回值为…的指针(地址),”类型名”表示函数返回的指针指向的类…

大家好,又见面了,我是你们的朋友全栈君。

转载自: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);

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152201.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 集中趋势中均值、中位数、众数以及偏态分布、偏度和峰度计算相关

    集中趋势中均值、中位数、众数以及偏态分布、偏度和峰度计算相关均值、中位数、中位数的概念以及优缺点对比。偏态分布难点分析,以及偏度、峰度计算公式。文末附相关学习链接。

    2022年9月16日
    0
  • vue-router实现路由懒加载( 动态加载路由 )_前端懒加载原理

    vue-router实现路由懒加载( 动态加载路由 )_前端懒加载原理为什么需要懒加载?    像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时vue异步组件 es提案的import() webpack…

    2022年10月7日
    0
  • webrtc开发入门_统计的简单应用

    webrtc开发入门_统计的简单应用WebRTC介绍及简单应用WebRTC,即WebRealTimeCommunication,web实时通信技术。简单地说就是在web浏览器里面引入实时通信,包括音视频通话等。WebRT

    2022年8月1日
    3
  • ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

    ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)ios事件-触摸事件3(UIButton和pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled()的关系)先看效果图本文中,凡是看到xxx(),即表示xxx是一个函数或者方法!!!事件分为事件传递和事件响应,其中,事件响应又称事件处理。具体代码ButtonVC的代码…

    2022年7月25日
    13
  • 常见JVM面试题及答案整理[通俗易懂]

    常见JVM面试题及答案整理[通俗易懂]前言总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。1.什么情况下会发生栈内存溢出。思路:描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的demo。我的答案:栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作…

    2022年6月9日
    28
  • 如何查找共享打印机的电脑_怎么通过计算机名连接共享打印机

    如何查找共享打印机的电脑_怎么通过计算机名连接共享打印机大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以电脑为例,查找网络共享打印机的方法有:1、双击网上邻居,查看工作组计算机,找到打印机主机的名字,双击进入,找到打印机,双击添加即可。2、左下角单击开始――设置――控制面板,打印机和传真,添加打印机,下一步,选择“网络打印机”,点击浏览,找到打印机主机名,双击选择,确定即可。打印机(Printer)是计算机的输出设备之一,用于将…

    2022年10月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号