指针的进阶(C语言)(下)

目录

4、数组参数、指针参数传参

4.1一维数组传参

4.2二维数组传参

4.3 一级指针传参

4.4 二级指针传参

5、函数指针

6、函数指针数组

7、指向函数指针数组的指针

8、回调函数

总结


续上篇

4、数组参数、指针参数传参

        在写代码的时候难免把【数组】或者【指针】传给函数,那函数的参数如何设计呢?

4.1一维数组传参

        

        对于arr1和arr2来说,这五种形式的传参都是合理的。

4.2二维数组传参

        上面的例子说明,二维数组传参,函数的形参只能省略第一个,因为对于一个二维数组,可以不知道有多少行,但是必须知道每一行有多少个元素,这样才能对数据进行分配。

        现在我们用指针进行传参:

        只有第三种指针(数组指针)传参是可行的。

4.3 一级指针传参

        

        如此一个函数,实现对数组的打印,实参部分传递指向数组首元素地址的指针p,以及记录数组大小的sz。形参接收用一个一维指针和一个整型变量接收。

        (思考:如果函数的形参是一维指针,那实参可以传什么呢?答案:整型变量的地址&a;指针*p;数组名.....)

4.4 二级指针传参

        对于二级指针传参,需要用二级指针接收,或者对于&指针传参,接收也是需要二级指针的。

        (思考:如果函数的形式参数是二级指针,调用该函数时,可以传什么类型的变量过去?答案是:二级指针;&数组名;&指针;指针数组.....)

5、函数指针

        数组指针:指向数组的指针就是数组指针

        函数指针:指向函数的指针就是函数指针        

函数也有地址码?先看一段代码:

        的确,函数也是有地址的。所以我们可以用一个指针去指向函数,这样的指针就是函数指针。对于函数来说,取地址函数名和函数名都是函数的地址。

        那么我们怎么去创建指针,去存放函数的地址呢?创建好之后又如何使用呢?

        看到这个代码,我们知道,函数指针的创建其实跟数组指针又异曲同工之妙,使用时只需要调用指针解引用并将要传的参数写入,就能得到函数运行后的返回值。在前期,这样的指针看上去没有很大用处,但是到了之后写一些较为复杂的代码时,函数指针的作用就会体现出来。

        简单讲一个用法:当我们想引用一个函数,传参为另外一个函数时,这时的形参就只能用函数指针接收。所以,函数指针的出现,让我们能够将函数作为参数传给另外一个函数,为代码提供了新的可能。

6、函数指针数组

        数组是一个存放同类型数据的存储空间,那么函数指针数组就好理解了,函数指针数组就是一个存放类型都为函数指针的数组。

        上面这个例子,arr就是一个函数指针数组,它存放了四个函数指针,这四个函数指针分别指向函数:Add、Sub、Mul、Div。由于这四个函数的函数返回值,函数参数都是同类型的,所以可以放在一个数组中。

        如何通过函数指针数组调用函数指针:

        arr[0]其实就是指向Add的函数指针,实现的是加法运算,发现结果如预期,所以调用成功。

        如此就可以调用函数指针数组中的函数指针,注意,这里我和前面调用函数指针不一样,我没有加*,也就是( (*arr[0])(1 , 2) ),加上这个*和不加都可以去调用函数指针所指向的函数,加上*是方便理解一点,不加其实也没问题,这是函数指针数组的独特特性,其他指针访问时一定要加上*。

        函数指针数组的运用,要配合函数指针,在以后实现复杂功能的程序编写时,运用函数指针数组,可以极大地简化程序地修改和优化成本。

7、指向函数指针数组的指针

        指向函数指针数组的指针,其实还是一个指针,只不过其内容是函数指针数组的首地址,指向函数指针数组。

        如何定义,如何运用:

        可以看到,只需要在定义函数指针数组的形式的基础上,再加一个*去声明指针pfarr即可,在运用时,用*进行解引用之后就跟函数指针数组的用法相同,可以看到,上面也例子也是成果调用了arr数组中第一个指针所指向的函数Add的功能。

        对于函数指针数组的指针,运用情况较少,但也是有运用的可能的,所以可以大概了解一下。

        接下来,我们要将一个很重要的知识了:回调函数。

8、回调函数

          回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定事件或条件发生时由另外的一方调用,用于对该事件或条件进行影响。(就是我在说函数指针的作用时提到过的)

        

        如此,就是回调函数的简单流程。在函数B中,有一个参数是指向A的函数指针,在函数B中可以通过PA函数指针去调用函数A。

        举例:qsort函数

        对于qsort函数,它可以比较任意数据的大小并排序,我们观察它的形参(上图),发现其中有一个函数指针类型:int(*cmp)(const void* e1,const void* e2)。

        这其实就是一种函数回调,qsort函数内调用了另一个函数cmp,根据数据的大小(单位字节)来对应地调用cmp这个函数。

        实现了排序。

总结

        本篇文章按顺序讲解了数组、指针传参;函数指针;函数指针数组;指向函数指针数组的指针;回调函数。是c语言进阶的指针篇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/401717.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 多表操作

一.多表关系 1.一对一关系 一个学生只有一张身份证;一张身份证只能对应一个学生。 在任一表中添加外键,指向另一方主键,确保一对一关系。 一般一对一关系很少见,遇到一对一关系的表最好合并。 2.一对多/多对一关系 一个部门…

ArcgisForJS如何访问Arcgis Server?

文章目录 0.引言1.准备ArcGIS相关工具2.创建含有ArcSDE地理数据库的MXD文件3.注册ArcSDE地理数据库4.发布数据到Arcgis Server5.ArcgisForJS访问ArcGIS Server数据 0.引言 ArcGIS API for JavaScript 是一个用于在Web和移动应用程序中创建交互式地图和地理空间分析应用的库。它…

抽象工厂模式 Abstract Factory

1.模式定义: 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 2. 应用场景: 程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的 具体类时, 可以使用抽象工厂 3.优点: 1.可以确信你从工厂得到的产品彼…

恒峰-智能高压森林应急消防泵:安全护林新利器

随着科技的发展,人类对自然资源的保护意识日益增强。森林作为地球上最重要的生态系统之一,对于维护生态平衡、净化空气、保持水源等方面发挥着举足轻重的作用。然而,森林火灾却时常威胁着这片绿色家园。为了更好地保护森林资源,智…

D5020——外围元件少,内含压缩器和扩展器静噪电路,可应用在1.5V立体声耳机上,响应时间可调

D5020是一块增益可调 的压缩、扩展电路。它有两个通道组成,一个通道作扩展用,另一个通道能作压缩或扩展用。电路内部含有小信号全波整流、检测信号的大小,用于调节输入或反馈通道的增益大小。含有温度特性较好的带隙精密基准源,静…

二.西瓜书——线性模型、决策树

第三章 线性模型 1.线性回归 “线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记. 2.对数几率回归 假设我们认为示例所对应的输出标记是在指数尺度上变化,那就可将输出标记的对数作为线性模型逼近的目标,即 由此&…

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

上进计划 | Python爬虫经典实战项目——电商数据爬取!

电商数据采集之——电商数据爬虫|电商数据采集API接口 电商数据爬虫背景 在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱&#…

昇腾ACL应用开发之模型转换ATC

一.前提条件 在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT,默认的安装路径会在/usr/local/Ascend里面,我们将该套件所需要的东西加入到环境变量中以便我们调用: 将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入…

【鸿蒙系统学习笔记】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS,它由 TypeScript(简称TS)扩展而来,在继承TypeScript语法的基础上进行了一系列优化,使开发者能够以更简洁、更自然的方式开发应用。值得注意的是,TypeScrip…

力扣 面试题 05.06. 整数转换

思路: 牵扯到二进制数,基本上要考虑位运算符,相关知识可以见http://t.csdnimg.cn/fzts7 之前做过类似的题目,大致思路就是先用按位异或^找出不同位,再用n&(n-1)计算出不同位的个数&#x…

nuxt项目搭建

1.先下载nuxt脚手架 yarn create nuxt-app <项目名>&#xff0c;记得安装完项目&#xff0c;npm i,下载node包 目录介绍 components 存放组件分别是头部&#xff08;包含导航&#xff09;和底部 layouts 页面布局&#xff0c;实现一个页面整体架构规则&#xff0c;头…

Sora 全网最全资料

大家好,本资料库是全网集体智慧的结晶,通过这个资料库,我们希望能够为读者提供一个全方位、多角度了解和研究Sora大模型的平台。每一部分都旨在深入探讨Sora大模型的不同方面,从技术细节到社会影响,再到未来展望,以确保读者能够获得最全面的信息和洞见。 📁一. 概念和…

yolov5导出onnx转engine推理

yolov5导出注意事项 配置 需要提供配置文件和权重文件&#xff0c;不然导出模型不能正常推理。 默认提供检测头。 ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-python发现报错 由于ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-pyt…

Android14 InputManager-InputManagerService环境的构造

IMS分为Java层与Native层两个部分&#xff0c;其启动过程是从Java部分的初始化开始&#xff0c;进而完成Native部分的初始化。 □创建新的IMS对象。 □调用IMS对象的start&#xff08;&#xff09;函数完成启动 同其他系统服务一样&#xff0c;IMS在SystemServer中的ServerT…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

mplfinance 使用make_addplot做复杂股票走势图

mplfinance 使用make_addplot做复杂股票走势图 1.代码 import talib as tb import pandas as pd import mplfinance as mpfimport matplotlib.pyplot as pltplt.rcParams[font.sans-serif][simHei] # 以黑体显示中文 plt.rcParams[axes.unicode_minus]False # 解决保存图像符…

Meta 发布 MMCSG (多模态智能眼镜对话数据集)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

LeetCode 热题 100 Day01

哈希模块 哈希结构&#xff1a; 哈希结构&#xff0c;即hash table&#xff0c;哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素&#xff0c;有两种方法&#xff1a; 1.从头遍历&#xff0c;复杂度&#xf…

Java 学习和实践笔记(15):面向过程和面象对象其实很简单!

学完这一节&#xff0c;才真正明白了什么叫面向对象和面向过程&#xff0c;其实很简单~ 第一个例子&#xff1a;怎样把大象装进冰箱 这个很清楚很容易地可以列出第一步。 第二个例子&#xff1a;怎样制造一台汽车 这个就很难确定哪一步做第一步。 面向过程和面向对象的区别 …