c语言函数指针具体作用,C语言-函数指针(Function Pointer)及进阶-程序员宅基地

技术标签: c语言函数指针具体作用  

前言

初学C语言的童鞋,通常在学完函数和指针的知识后,已经是萌萌哒,学习到了函数指针(请注意不是函数和指针),更是整个人都不好了,这篇文章的目的,就是帮助我的童鞋们理解函数指针。�

函数指针概述

首先我们需要回顾一下函数的作用:完成某一特定功能的代码块。

再来回忆一下指针的作用:一种特殊的变量,用来保存地址值,某类型的指针指向某类型的地址。

下面定义了一个求两个数最大值的函数:

int maxValue (int a, int b) {

return a > b ? a : b;

}

而这段代码编译后生成的CPU指令存储在代码区,而这段代码其实是可以获取其地址的,而其地址就是函数名,我们可以使用指针存储这个函数的地址——函数指针。

函数指针其实就是一种特殊的指针——指向一个函数的指针。在很多高级语言中,它的思想是很重要的,尤其是它的“回调函数”,所以理解它是很有必要的。

函数指针定义与使用

任何变量定义都包含三部分: 变量类型 + 变量名 = 初值,那么定义一个函数指针,首先我们需要知道要定义一个什么样的函数指针(指针类型),那么问题来了,函数的类型又是什么呢?我们继续分析这段代码:

int maxValue (int a, int b) {

return a > b ? a : b;

}

这个函数的类型是有两个整型参数,返回值是个整型。对应的函数指针类型:

int (*) (int a, int b);

对应的函数指针定义:

int (*p)(int x, int y);

参数名可以去掉,并且通常都是去掉的。这样指针p就可以保存函数类型为两个整型参数,返回值是整型的函数地址了。

int (*p)(int, int);

通过函数指针调用函数:

int (*p)(int, int) = NULL;

p = maxValue;

p(20, 45);

回调函数

上述内容是函数指针的基础用法,然而我们可以看得出来,直接使用函数maxValue岂不是更方便?没错,其实函数指针更重要的意义在于函数回调,而上述内容只是一个铺垫。

举个例子:

现在我们有这样一个需求:实现一个函数,将一个整形数组中比50大的打印在控制台,我们可能这样实现:

void compareNumberFunction(int *numberArray, int count, int compareNumber) {

for (int i = 0; i < count; i++) {

if (*(numberArray + i) > compareNumber) {

printf("%d\n", *(numberArray + i));

}

}

}

int main() {

int numberArray[5] = {15, 34, 44, 56, 64};

int compareNumber = 50;

compareNumberFunction(numberArray, 5, compareNumber);

return 0;

}

这样实现是没有问题的,然而现在我们又有这样一个需求:实现一个函数,将一个整形数组中比50小的打印在控制台。”What the fuck!”对于提需求者&

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29305337/article/details/116994796

智能推荐

MyBatis-Plus使用queryWrapper解决字符串中含数字的排序问题_mybatis字符串数字排序-程序员宅基地

文章浏览阅读7.4k次,点赞6次,收藏9次。今天遇到了Oracle数据库字符串(含数字)排序问题,这里记录的是如何用MyBatis-Plus的queryWrapper条件构造器来解决的方法。造成的原因:数据库字段为varchar类型(若为Number类型则无此问题)数据库字符串排序是按照顺序一位一位比较的,按照ascII码值比较。如:2比1大,所以12会排在2前面解决办法:先按字符串长度排序,再按字段排序关键代码(queryWrapper条件构造器实现形式)//利用数据库length函数获取字符串长度(这里的code是我数据库中的_mybatis字符串数字排序

kube operator部署kubernetes集群_kubeop-程序员宅基地

文章浏览阅读1.3k次。kube operator简介kube operator是一个kubernetes集群部署及多集群管理工具,提供web ui支持在离线环境部署多个kubernetes集群。KubeOperator 是一个开源项目,通过 Web UI 在 VMware、OpenStack 和物理机上规划、部署和运营生产级别的 Kubernetes 集群。支持内网离线环境、支持 GPU、内置应用商店,已通过 CNCF 的 Kubernetes 软件一致性认证。官网:https://kubeoperator.io/离线包_kubeop

openmv学习日记(二)openmv4 H7_openmv4 h7 cam-程序员宅基地

文章浏览阅读1.1w次,点赞10次,收藏81次。今天先介绍一下openmv4 H7的相关资料文章目录简介引脚电路图板子信息尺寸规格功耗温度范围简介openmv4 H7具有:STM32H743VI ARM Cortex M7 处理器,480 MHz ,1MB RAM,2 MB flash. 所有的 I/O 引脚输出 3.3V 并且 5V 耐受。并且还有以下的IO接口:1.全速 USB (12Mbs) 接口,连接到电脑。当插入Open..._openmv4 h7 cam

机器学习与数据挖掘网上资源搜罗——良心推荐-程序员宅基地

文章浏览阅读509次。前面我曾经发帖推荐过网上的一些做“图像处理和计算机视觉的”有料博客资源,原帖地址图像处理与机器视觉网络资源收罗——倾心大放送http://blog.csdn.net/baimafujinji/article/details/32332079做机器学习和数据挖掘方面的研究和开发,常会在线搜索一些资源,日积月累便挖出了一堆比较牛的博主,特别说明:做这个方向的

windows10和kali linux双系统的安装_kali系统和win可以共同吗-程序员宅基地

文章浏览阅读1.5w次,点赞14次,收藏92次。0x00 准备工具1、容量8G及以上的U盘2、kali linux镜像下载 - 下载地址:https://www.kali.org/downloads/3、镜像刻录软件Win32 Disk Imager - 下载地址:https://win32-disk-imager.en.lo4d.com/4、硬盘分区助手 - 下载地址:https://www.disktool.cn/5、制作引导工具..._kali系统和win可以共同吗

毕业设计django新闻发布和评论管理系统-程序员宅基地

文章浏览阅读587次,点赞6次,收藏14次。因为媒体的宣传能够带给我们重要的信息资源,新闻发布和评论管理是国家管理机制重要的一环,,面对这一世界性的新动向和新问题,新闻发布如何适应新的时代和新的潮流,开展有效的信息服务工作,完成时代赋予的新使命?在新闻发布和评论管理系统开发之前所做的市场调研及其他的相关的管理系统,都是没有任何费用的,都是通过开发者自己的努力,所有的工作的都是自己亲力亲为,在碰到自己比较难以解决的问题,大多是通过同学和指导老师的帮助进行相关信息的解决,所以对于新闻发布和评论管理系统的开发在经济上是完全可行的,没有任何费用支出的。

随便推点

HTTP方式在线访问Hadoop HDFS上的文件解决方案

为了通过HTTP方式在线访问HDFS上的文件,您可以利用WebHDFS REST API或者HttpFS Gateway这两种机制实现。1:httpfs是cloudera公司提供的一个hadoop hdfs的一个http接口,通过WebHDFS REST API 可以对hdfs进行读写等访问2:与WebHDFS的区别是不需要客户端可以访问hadoop集群的每一个节点,通过httpfs可以访问放置在防火墙后面的hadoop集群3:httpfs是一个Web应用,部署在内嵌的tomcat中。

WordPress优化Google广告加载速度_wordpress 怎么做谷歌优化-程序员宅基地

文章浏览阅读236次。网站的快速加载是良好用户体验和搜索引擎优化的要素之一,但每当谷歌AdSense的广告代码部署到网站上时,速度都会显着下降,这是因为要下载大量文件才能显示广告,并且其中包含大量无用、被墙的请求及代码。_wordpress 怎么做谷歌优化

c# controls.add 控件的使用 ,间接引用还是值引用_this.controls.add-程序员宅基地

文章浏览阅读8.6k次。c# controls.add 控件的使用 10函数内部用下面代码增加控件:Button btn = new Button();btn.Location = new Point( 20, 20);btn.Size = new Size( 60,40);btn.Text = "btn'sText";this.Controls.Add( btn );问题:函数执行完后,bt_this.controls.add

占位式插件化一Activity的跳转_activity跳转 插件-程序员宅基地

文章浏览阅读329次。原理宿主APP安装在手机中的APP,并且通过该APP加载插件中的Activity插件APP没有安装的apk,通过宿主直接打开其内部Activity标准(协议)宿主APP和插件APP通信的桥梁。宿主APP通过一个空壳Activity(代理Activity)加载插件app中的Activity,实际上插件app中的Activity并没有入栈,也没法入栈,因为插件app没有安装,没有上下文和..._activity跳转 插件

PTA 剥洋葱(C语言 + 详细注释 + 代码超简单)_c语言pta怎么使用-程序员宅基地

文章浏览阅读1.0k次,点赞9次,收藏13次。输入格式:一行,一个整数,即图形的层数输出格式:如上述图形输入样例:3输出样例:AAAAAABBBAABCBAABBBAAAAAA//打印图形题关键是找规律,一般只需两重循环(行循环、列循环)#include<stdio.h>#include<string.h>int main() { int i, n; char ..._c语言pta怎么使用

docker配置国内镜像源_docker国内镜像源-程序员宅基地

文章浏览阅读3.3w次,点赞9次,收藏25次。刚开始学习docker,发现下载镜像非常的慢。如果不经过,docker的镜像下载都来源于国外,因此需要配置国内的镜像源。Docker中国区官方镜像。_docker国内镜像源