C语言(函数指针数组)详解

article/2025/9/22 4:07:41

要了解函数指针数组,可以从三个角度来分析。所谓函数指针数组,从字面意思上来解析,函数指针数组的组成有三个点,函数,指针,数组。首先我们知道,函数指针数组,是一个数组,数组的每个元素是函数指针,也就是一个数组,用来存放指针,每个指针指向一个函数。

先从指针开始了解:

指针

什么叫指针,指针是一个存放地址的变量。上图:

每个变量在创建时,都会在内存中分配一块空间,空间的大小会根据数据类型进行分配。

比如int类型的变量,在内存当中会分配4个字节的空间,每个空间都会有自己的地址,要想取出地址,需要用到取地址符号 & 。比如&a,意思就是取出a的地址。要想将a的地址存起来,就需要用到指针,指针就是用来存地址的。

指针变量的创建:指针类型* 指针名 = &变量

例如:int* p = &a;

p表示指针的名字,* 与p结合,表示这是一个指针变量,int是存放变量地址的类型。

再举个例子,上图:

我们将a的地址存放到p中,就可以通过p来找到a当中的内容。p是一个指针变量,他里面存的是地址,通过地址来访问a存储的数据,需要用到 * 号,* 表示解引用,*p解引用就可以找到a中存储的数据,而p本身存储的是地址,所以上图显示将p以地址的形式打印出来,显示的是a在内存中的地址。

指针数组

指针数组,从字面意思上来理解,就是存放指针的数组。

上图:

首先我们创建了a ,b ,c三个变量,并且已经赋值,然后创建一个指针数组,数组可以存放3个元素,每个元素的类型是int*。在初始化数组的时候将a,b,c的地址取出来放入arr中。

arr[0]存的是a的地址,arr[1]存的是b的地址,arr[2]存的是c的地址。

上面我们讲到,要想通过地址访问数据,需要用到*号,*arr[0]就可以找到a存储的数据,同理,arr其他的元素也可以使用*号解引用找到存储的数据。

函数指针

函数指针从字面意思上来理解,就是存放函数的指针

上图:

首先我们创建了一个Add的加法函数,然后创建一个函数指针,函数名就代表地址,但是和数组 不一样,数组名代表的是首元素的地址,而函数不存在首元素这种概念。

函数指针的创建: 返回值 (*指针名)(数据类型,数据类型)

例如:int (*p) (int i,nt )

首先p要和*号结合,但是圆括号的优先级比较高,如果不用括号把*p括起来,那么语法上就有了错误,举个例子:

int * p(int,int)

编译器会认为p和括号先结合,如果p和括号先结合,那么就成了一个函数,表示的意思是函数的返回值是int*类型,参数是两个int类型的数据,所以我们要用括号把*p括起来。

如上图所述,p中存放的是函数Add的地址,而函数名代表的就是地址,我们使用Add函数的时候语法规范是这样的 Add(x,y);

那么既然函数名就是地址,而p中存放的是Add函数的地址,所以p就代表了Add,所以我们可以将p看成Add,p(x,y)同样可以做到Add(x,y)的效果,这两者在使用的时候没有任何差异。

函数指针数组

交代完指针,数组,函数之后,现在来详细讲解本文的重点(函数指针数组)

所谓函数指针数组,就是一个存放函数指针的数组

我们用一个计算器小程序来举例,上图:

我们可以看到,这一个简单的计算器程序大概需要80行代码左右,维护起来也比较麻烦,当然这是常规逻辑。

现在,我们用函数指针数组来改造代码,让代码量变少,变得更好维护,上图: 

可以看到,改造后的代码摒弃了switch语句,采用的是if判断,一些繁琐的输出语句和选择也全部被优化掉,而今后不论是添加函数功能,还是删除,只需要修改数组大小,删除数组元素即可,大大简化了代码,变得更好维护。

让我们来仔细分析一下改造后的代码:

 先从函数指针数组开始分析,

函数指针数组的创建 返回值(*数组名[元素个数])(数据类型,数据类型)

例如 int (*p[4])(int ,int)

首先这是一个数组,所以p要和[]先结合,我们拿掉数组名后剩下的就是数组的元素类型

也就是: int (*)(int int)   函数指针

上面我们讲过,函数指针数组就是用来存放函数指针的,而函数指针存放的地址就是函数名,函数指针和函数的使用方法上除了名字没有区别,所以既然函数指针存放的是函数名,函数名就是函数地址,我们直接就将函数名(地址)存入数组中。

然后进入while循环,打印菜单,提示用户输入,进入if判断,0则退出。

我们用i来存储用户选择的功能,然后用i作为函数指针数组的下标,通过下标来访问数组的元素

比如arr[0],而数组的元素是函数指针,也就是函数的地址,我们知道函数名就是函数的地址,我们在初始化数组的时候,放入的就是函数名(函数的地址),所我们可以直接用数组的下标来使用函数:arr[i - 1](x,y)。以此类推,如果用户输入的是1,2,3,4,我们就使用函数来实现算术功能,输入其他的数则继续循环,回到选择功能。输入0 ,break跳出循环,结束程序。

以上就是函数指针数组的详解,欢迎大家评论与指点!!!


http://chatgpt.dhexx.cn/article/R7wBc5mV.shtml

相关文章

c语言 指针数组

文章目录 前言一、指针数组的定义声明,赋值:二、指针数组的应用:总结 前言 今天我们讲解一下什么是指针数组。 一、指针数组的定义声明,赋值: 什么是指针数组呢? 指针数组 :就是首先定义一个数组,数组里面…

c语言之——指针数组与数组指针

一、指针数组和数组指针的定义 1. 指针数组:是指一个数组里面装着指针,也即指针数组是一个数组; 定义形式:int *a[10]; 说明:[]的优先级高于*,该定义形式应该理解为:int * (a[10]…

关于指针数组与数组指针详解(知识点全面)

1.目录 1.指针数组 2.数组指针 2.它们的区别 1.指针数组 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。其一般形式为: 数据类型 *数组名[常量表达式][常量表达式]...... ; 它是一个数组,数组的元素都是指针&…

指针数组(指针类型的数组)

顾名思义:指针类型的数组,首先是一个数组,数组元素存储的是指针。(中国的修饰词往往都在前面,而西方修饰词往往是放在后面) 语法如下: 目标类型 数组名称[元素个数] 如:int * p[3] 数组p有3个元素&#x…

数组指针和指针数组的区别

文章目录 前言 一、什么是指针数组? 1.定义 2.声明 3.指针数组的内存示意图 二、什么是数组指针? 1.定义 2.声明 3.内存示意图 三、如何区别指针数组和数组指针? 四、实践理解 总结 前言 这几天老师有问到指针数组和数组指针的区别&#xff…

C语言—指针数组与数组指针

前言: 看到标题的小伙伴可能会有点疑惑,什么是指针数组,数组指针??傻傻分不清楚,不怕,听我慢慢道来。 正文: 要想弄清楚这两个概念,我们不妨举几个例子: …

指针数组和数组指针的区别及其详解

引言 对于指针数组和数组指针的概念,相信很多人经常会感到迷惑,见到二者一时不能分辨究竟对应哪一个才是对的。接下来我们来分析一下二者区别。 我们来看一下这个示例代码: int *ptr1[10]; int (*ptr2)[10];对于上述代码语句,你…

C语言学习—数组指针和指针数组的区别

前言 本文章对指针数组和数组指针的区别进行了分析介绍 一、数组指针和指针数组的定义 1.数组指针:定义 int (*p)[n]; 由于()的优先级高,首先说明p是一个int类型指针,它是指向一个整型(int)的一维数组,这个一维数组的长度是n&a…

指针数组和数组指针

1.什么是指针数组和数组指针 顾名思义:指针数组是“存放指针的数组”,这个变量是一个数组,用指针修饰,数组中的每个元素都是指针。 数组指针是“指向数组的指针”,这个变量是一个指针,用数组修饰&#xf…

指针数组和数组指针(非常易懂)

指针数组与数组指针 目录: 1.指针与一维数组 2.指针与二维数组 3.指针数组与数组指针 1.指针与一维数组 当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址。若定义一个指针变量,并…

数组指针和指针数组

首先,理解一下数组指针和指针数组这两个名词: “数组指针”和“指针数组”,只要在名词中间加上“的”字,就知道中心了—— 数组的指针:是一个指针,什么样的指针呢?指向数组的指针。 指针的数…

如何下载风云卫星数据?

如何下载风云卫星数据? 这个是下载风云数据的网址: http://satellite.nsmc.org.cn/PortalSite/Data/Satellite.aspx 1.查找数据 步骤见如图1: 2.选择数据 选择“搜索”以后就就出现图2这个页面:文件名如果被省略了&#xff0…

总结部分SAR卫星及其参数以及SAR卫星发展的趋势

总结国内外失效、在轨和未来发射的SAR卫星及其参数 国内的SAR卫星及其参数 1、高分三号卫星 高分三号卫星(GF-3)于2016年8月10日成功发射,是我国首颗分辨率达到1米的C频段多极化合成孔径雷达(SAR)卫星,自然资源部为其主用户。 GF-3星的分辨率可以达到…

spot卫星介绍与数据下载

1.简介 1.1基本信息 SPOT系列卫星是法国空间研究中心(CNES)研制的一种地球观测卫星系统,已发射SPOT卫星1-7号。目前CNES已开放spot1-5的卫星数据,可免费下载数据的时间范围为1986年-2014年。 1.2卫星年表 名称信息SPOT-11986年…

空气污染气体卫星数据的下载教程

影响空气质量的主要气体有:二氧化硫、一氧化碳、二氧化氮、可吸入颗粒和臭氧等。我们可以通过Giovanni平台下载空气污染气体的卫星产品数据。 Giovanni平台介绍 Giovanni, 是NASA 旗下的地球科学可视化工具。通过简单的操作,即可将NASA 相关…

GRACE卫星介绍与解密数据下载

1 简介 1.1 基本信息 GRACE ,Gravity Recovery and Climate Experiment,由 NASA 和德国宇航中心(DLR)联合研制,于 2002 年 3 月 17 日在发射。发射 时其预计寿命为 5 年,一直超期服役到2017年坠毁。后继卫…

风云气象卫星数据处理调研报告

风云卫星遥感数据服务平台 http://www.nsmc.org.cn/NSMC/Home/Index.html http://data.nsmc.org.cn/PortalSite/Default.aspx 风云四号气象卫星是我国第二代静止气象卫星,充分考虑海洋、农业、林业、水利以及环境、空间科学等领域的需求,以实现综合利用…

worldview卫星数据的查询方法

地理遥感生态网平台代理worldview1、worldview2、worldview3、worldview4、quickbird、geoeye、ikonos、 pleiades、spot1、spot2、spot3、spot4、spot5、spot6、spot7、landsat5(tm)、landsat(etm)、landsat8、rapideye、alos、aster、Hyperion(EO-1)、kompsat2、kompsat-3、k…

PL(Planet)卫星群遥感数据介绍及应用

1. 卫星介绍 星球实验室(Planet Labs)是由前美国空间局(NASA)科学家于2010年在旧金山成立的一家遥感卫星数据公司。该公司在世界上首次研发成功微卫星群技术,是世界上唯一具有全球高分辨率高频次全覆盖的遥感卫星系统…

CloudSat卫星数据下载

介绍 CloudSat标准数据产品由位于柯林斯堡的科罗拉多州立大学大气合作研究机构的CloudSat数据处理中心分发。数据产品ID以及产品名如下: 下载 方式1,交互式下载。 在官网注册,官网:http://www.cloudsat.cira.colostate.edu/o…