摘要:

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

正文:

指针函数

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

定义

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

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

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

返回值问题

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

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

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

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

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

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

函数指针

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

定义

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

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

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

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

赋值

函数指针的赋值操作:

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

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

调用

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

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

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

使用场景

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

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

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

  1. ajax值传递给其他函数,jquery中ajax返回值无法传递到上层函数

    function通过ajax调用获取后台数据,结果返回出来的结果均为空,代码如下: function chart_coinbase_getdata() { var test = {postdata:& ...

  2. 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...

  3. 【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )

    文章目录 前言 一.业务子函数接口定义要点 二.完整代码示例 前言 字符串开发模型 : strstr-while/do-while 模型 : 在 字符串 中 查找 子串特征 ; 两头堵模型 : 两个指 ...

  4. ostream作为函数返回值_GO语言基础函数

    GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...

  5. go函数详解:函数定义、形参、返回值定义规范、函数内存分析、不支持重载、支持可变参数、基本数据类型和数组默认都是值传递的、支持自定义数据类型、函数返回值命名

    引入 [1]为什么要使用函数: 提高代码的复用型,减少代码的冗余,代码的维护性也提高了 [2]函数的定义: 为完成某一功能的程序指令(语句)的集合,称为函数. [3]基本语法 func 函数名(形参列 ...

  6. 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

    题目要求: 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值.在main函数中输入一行字符串,分别调用两个函数,输出反序后的 ...

  7. py6_Python 内置函数/普通自定义函数 及参数和返回值

    ################################################## 目录 活动简介 Python 函数参数 如何定义一个函数 示例定义一个无参函数 形参和实参的概念 ...

  8. 常成员函数函数和返回值为常量的函数

    常成员函数,它的形式是在成员函数后面加上const修饰,它是为了防止特定函数改变本类对象的数据成员而产生的,目的就是保护数据成员.在常成员函数中,你不能改变数据成员的值,你也不能在常成员函数中调用非常 ...

  9. 如何编写有多个返回值的C语言函数

    1引言 笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样 ...

最新文章

  1. ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI
  2. 大脑使用交叉存储,来区分现在和过去
  3. VS2005 / windows sdk7.1配置
  4. 【摩天好课推荐】传统企业数字化转型的困惑、思考与实践
  5. hive向mysql导数据_导入Hive数据导MySQL
  6. 【CyberSecurityLearning 附】使用PHP语言搭建简单的论坛:注册功能实现+PHP个人中心设计+简单留言板
  7. SAP UI5 application - model propagation
  8. FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库
  9. manjaro linux下载软件,manjaro linux
  10. Python twisted框架使用解析
  11. 金蝶移动bos开发教程_移动安全(四)|NDK开发教程_JavaToC
  12. java jdbc 连接mysql 数据库
  13. Intellij IDEA 代码格式化配置和快捷键
  14. 客车网上订票系统项目--在线预约、个人中心我的订单
  15. c++ fbxsdk安装配置_Linux上安装软件 - coydone
  16. 计算机 64虚拟内存设置方法,64位的WIN7,4G内存,虚拟内存怎么设置
  17. 织梦dedecms TAG标签调用汇总(史上最全)
  18. python 战舰_战舰python代码学院
  19. python中import math用法_Python math.hypot() 方法
  20. 关于APP抓包,Mac就不配拥有姓名吗?

热门文章

  1. android 蓝牙锁应用开发实例(三)蓝牙相关功能实现【第一部分】
  2. MATLAB---将索引图像转换为灰度图像前后对比显示
  3. hexo博客matery主题个性化配置
  4. python人力成本数据测算_年度人力成本数据分析思维
  5. 5、交易开拓者-公式应用
  6. C++汽车销售管理系统
  7. Tensorflow实战(黄文坚)——多层感知机代码实现
  8. 思路问题,需要深刻反省
  9. 仿写Android屏幕解锁小应用
  10. 项目进度管理:控制进度--监控过程组