函数指针,指针函数,返回值为指针的函数「建议收藏」

函数指针,指针函数,返回值为指针的函数「建议收藏」在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向函数的指针,本质上是一个指针,只是这个指针指向的对象是函数,而不是一般意义上的存储对象。

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

摘要:

在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向函数的指针,本质上是一个指针,只是这个指针指向的对象是函数,而不是一般意义上的存储对象。

正文:

指针函数

指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

定义

指针函数的定义格式如下:函数类型 *函数名([参数列表])

当然,也可以让指针标志*与函数类型紧贴在一起,与函数名分开,其含义一致,格式如下:函数类型* 函数名([参数列表])

相比上一种,这种方式更能表示这是一个指针函数。在将指针函数与函数指针区分时,也可以通过“指针标志*能否和函数名分离”来判断这个一个指针函数,还是一个函数指针。

返回值问题

指针函数的使用和一般函数的使用相同,但需注意返回值问题。对于一个返回值为指针的函数,不能返回auto型局部变量的地址,但可返回static型变量的地址。

这是因为auto型变量的生存周期很短,当函数返回时,auto型变量的内存空间将被释放,如果返回值是auto型变量,那么这个返回指针将无效,变成野指针。而static类型变量占用的内存空间则不会因为函数返回而被释放,不会出现野指针问题。

所以编写指针函数使要注意返回值。总体原则是:返回的指针对应的内存空间不会因函数返回则被释放掉。常用的返回指针有以下几种:

(1)      函数中动态分配内存空间(通过malloc等实现)的首地址;

(2)      静态变量(static)或全局变量所对应的变量的首地址;

(3)      通过指针形参所获得的实参的有效地址。

函数指针

函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。

定义

函数指针的定义格式如下:函数类型 (*指针变量) ([参数列表])

在形式上,函数指针的特征是使用一个括号包裹指针标志和指针变量,将括号移除,函数指针就变成指针函数。

之所以容易混淆指针函数和函数指针,是因为指针函数的形式如一般指针变量类型,如:int *x、int *y()、int(*z)()

这里x和z表示一个指针,而y则表示一个函数,所以要注意区分指向变量的指针和指向函数的指针的形式区别。

赋值

函数指针的赋值操作:

使用函数名给指向函数的指针变量赋值。其赋值的一般格式如下:函数指针 = [ &] 函数名;

其中,函数名后不能带括号和参数,函数名前的&是可选,建议不要使用。

调用

函数指针调用格式:函数指针变量([实参列表]); 或 (*函数指针变量)([实参列表]);

推荐第二种用法。这种方法可以很好的表明这是一个函数。而第一种方法则很容易造成误导。

之所以容忍一种调用方法是因为ANSI C 委员会决定容许这种普通函数调用句法。这是因为编译器知道它是一个指向函数的指针,并且它还知道在该环境下所能做的惟一的一件事就是调用函数,因此这里没有任何模糊不清的表达。

使用场景

函数指针的常见用途就是把函数指针作为参数传递给函数。

一个函数通过由运行时决定的指针来调用另一个函数的行为叫做回调(callback)。用户将一个函数指针作为参数传递给其它函数,后者将“回调”用户的函数。这样就可实现通过同一接口实现对不同类型数据、不同功能的处理。

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152216.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 4g网络怎么设置网速更快(移动4g网速慢怎么办)

    转载自品略图书馆http://www.pinlue.com/article/2020/05/1618/5110522403532.html别人是4G网,你也是4G网,你却更慢,不妨这样设置,网速飞快提升随着5G网络的走近,人们越来越期待未来的生活,以后电视上电影里面不可能实现的在现实中可能都会实现,5G网络的到来,人们的生活又会有怎样翻天覆地的变化,不过现在5G网络还没有正式运用,可能要到明年才能正式普及,所大家手中用的手机都是搭载4G网络,而有人发现,别人是4G网,你也是4G网,你却更慢,不妨这.

  • 华为ensp模拟器安装教程_华为模拟器路由器无法启动

    华为ensp模拟器安装教程_华为模拟器路由器无法启动eNSP是个很好用的学习工具,但是其安装过程并不那么简单,很多同学在模拟器的安装过程遇到了诸多问题。安装的软件如下:1、V-BOX版本5.16,经实际测试完美兼容最新版eNSP在win-7和win-10的运转;2、Wireshark抓包软件,汉化版,在win-7,win-10与ENSP工作正常;3、eNSP最新版1.300.10,实际检验在win-7,win-10工作正常,自带镜像工作正…

  • pycharm中使用anaconda部署python环境_anaconda pycharm环境配置

    pycharm中使用anaconda部署python环境_anaconda pycharm环境配置总有那么多的知识点,看起来这么简单(其实解决的方法也很简单,无非是某个地方要加括号,要加双括号等小问题),但没有人好好讲的话会浪费很多时间。笔者先安装了Anaconda和Spyder,运行TensorFlow-GPU,最近安装了pycharm,想利用之前配置好的环境(省去依赖包的配置)。找了一些资源都没有将清楚。以下简洁版:1、新建项目,选择“Existinginterpreter”…

  • 博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)[通俗易懂]

    博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)[通俗易懂]一、zone的定义Zone是Brocade交换机上的标准功能,FCSWITCH上的Zone功能类似于以太网交换机上的VLAN功能,它是将连接在SAN网络中的设备(主机和存储),逻辑上划到为不同的区域内,使得不同区域中的设备相互间不能FC网络直接访问,从而实现网络中的设备之间的相互隔离。二、Zone的功能包含以下两点:1.防止主机节点访问未经授权的存储。Zone中的设备只能访问同一Zone中连接到Fabric的其它设备。不在Zone中的设备不能被Fabric中的其他设备访问。2.隔离不必要状态

  • java string类型转换成int类型(string怎么强转int)

    String是引用类型,int是基本类型,所以两者的转换并不是基本类型间的转换,这也是该问题提出的意义所在,SUN公司提供了相应的类库供编程人员直接使用

  • vue怎么关闭eslint_如何关闭eslint

    vue怎么关闭eslint_如何关闭eslint@[TOC]VUE关闭eslint严格模式VUE关闭eslint严格模式如果在使用vue@cli搭建vue工程时,不小心选择了eslint严格校验模式,对于开发人员调试代码是很麻烦的事,那么如何关掉eslint严格模式呢?1.在package.json文件下找到eslint配置”eslintConfig”:{“root”:true,”env”:{“node”:true},”extends”:[“plugin:vu

发表回复

您的电子邮箱地址不会被公开。

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