二维数组 和 变长数组

在上一期的内容中,为诸君讲解到了一维数组,在一维数组的基础上,C语言中还有着多维数组,其中,比较典型且运用较为广泛的就是我们今天的主角——二维数组

一 . 二维数组的概念

我们把单个或者多个元素组成的数组定义为一维数组。由此推演,我们可得:一维数组作为数组的元素,这就是我们的二维数组;把二维数组作为数组的元素,这就是我们的三维数组......

二维数组以上的数组我们就将其称为多维数组

二 . 二维数组的创建

二维数组相较于一维数组,在表达形式上其实没有太大的变化,多了一个括号而已嘛,其实质也就是多了一个纵列,话不多说,咱们直接上图理解:

三 . 二维数组的初始化

初始化这个概念,跟诸君都是老朋友了昂,我们每当介绍到一个变量的时候,都会讲到其初始化,所以,二维数组也不例外,二维数组的初始化格式跟一维数组相差无几,只是略有差异而已

(1)二维数组的完全初始化

关于二维数组可以省略“ 行 ”但不能省略“ 列 ”:诸君都是聪明人,大家在脑袋里面推演一下就能相同了,当我们拿到一串数字,虽然我们不知道它有几行,但我们知道了“ 列 ”数,我们自然是可以大致的将二维数组的表格罗列出来;但我们只知道“ 行 ”,不知道“ 列 ”却办不到

这种完全初始化的二维数组在其内部的表现形式为:

(2)二维数组的不完全初始化

这两个二维数组在其内部的表现形式为:

(3)按照“ 行 ”初始化

 这种按照“ 行 ”初始化的二维数组在其内部的表现形式为:

四 . 二维数组的下标

二维数组跟一维数组的下标格式一样,如上图所示,仅仅只是多了个纵列而已,由上至下从0开始的递增变化,大家可以简单地将其理解为我们数学当中的坐标,只是这个特殊的坐标是从左上角开始,数值是由0开始

如上图,当我们想要找到三行二列的存放的数时,我们只需要输出 arr [2] [1] 即可,当然,由于这是一个整形数组,我们存放的也是整数,所以我们依旧用“ %d ”打印,如:

五 . 二维数组的输入与输出

这几个字看似陌生,其实都是天天打交道的老朋友啦,你不信?那我就来为诸君逐字分析:

提到输入,诸君是不是应该第一时间想到 scanf 函数

提到输出,诸君是不是应该第一时间想到 printf 函数

这就只剩下了我们的二维数组了,且我们的二维数组是不是有多个元素?这就需要我们去“ 遍历 ”的输入与输出,遍历这个词儿大家能get到吧?大家可以理解为通过循环的方式一个一个去接触,所以我们会选择用 for 循环去遍历输入与输出每个元素

这样子看来,二维数组的输入与输出是不是诸君最熟悉的陌生人呢?

那么话不多说,咱们就直接上图了昂:

六 . 二维数组在内存中的储存

大声的告诉我,我们想要探究一个东西在计算机的内存中的储存方式,我们该怎么做?

打印地址嘛,地址一打印出来,一瞧,这不比看干巴巴的文字有用,上图!

(1)这是x64环境下,也就是64位

(2)这是x86环境下,也就是32位

之前提到过,计算机中地址都是以十六进制数储存的

所以由此观之:不管是在x64还是在x86环境下,只要是整型,每个地址之间都相差4个字节。且我们也可以得出,二维数组中的每个元素也是连续存放

七 . 变长数组

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式。这样的语法限制呢,就让人在写代码的时候很不方便,使得我们创建数组不够灵活,数组大了浪费空间,数组小了又会越界,造成bug,很不爽对吧

当然了,这些小问题,诸君不必多虑昂,有限制就必定有突破嘛,在C99当中就改革创新了,给了我们一个变长数组(variable-length array,简称 VLA)的新特性,这就使得我们可以运用变量来创建数组,如下图所示的形式:

变长数组的长度取决于变量 “ n ”的值,编译器没办法事先预知,只有当我们的程序在运行时,才能知道这个“ n ”是多少,我们才能确定数组长度。因此,变长数组是不能初始化的。这个点应该很好理解昂,大家想一想嘛,初始化不就是为了给数组提供元素数据嘛,你这一输入,数组里的长度不就定死了嘛,那还咋变长啊是吧

它的好处是:程序员不必在开发时,随意为数组指定一个估计的长度, 程序会在运行时为数组分配
精确的长度
但它有一个比较迷惑的点:变长数组的意思是 数组的大小是可以使用变量来指定的,在程序运行的
时候,根据变量的大小来指定数组的元素个数 ,而不是说数组的大小是可变的。 数组的大小一旦确
定就不能再变化了(天王老子来了不行!)

但是呢,很遗憾昂,在我们使用的VS2022版本上,虽然支持绝大部分的C99语法,但恰巧就没有

这个变长数组。当然,有gcc编译器的小伙伴们可以去试一试,我就不试了,我只有VS2022,大

家了解到这个变长数组的概念就好 

OKK,有关数组的知识点这是这两期的内容了,一维数组、二维数组、变长数组等等。数组的内容还是很重要的,因为它跟我们C语言中的一大拦路虎——指针,也就是我们俗称的“ 地址 ”息息相关,所以还望诸君一定引起重视。鄙人这两天就被指针搞得焦头烂额,唉,难搞哟,革命尚未成功,同志仍需努力!多的不唠了,加油加油,咱们也下期再见,与诸君共勉!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode 修改 Markdown Preview Enhanced 主题与字体

VScode 修改 Markdown Preview Enhanced 主题与字体 1. 修改前后效果对比2. 修改主题2.1 更改默认主题2.2 修改背景色 3. 修改字体 VS Code基础入门使用可查看: VS Code 基础入门使用(配置)教程 其他Vs Code 配置可关注查看: Vs C…

2024年如何选什么版本FL Studio才适合自己编曲?

fl studio是什么软件 水果编曲软件 FL Studio,全称为Fruity Loops Studio,是一款全能音乐制作环境或数字音频工作站(DAW),集编曲、录音、剪辑、混音等多种功能于一身。 FL Studio最初名为Fruity Loops,因…

外网如何访问内网?快解析

由于公网IP资源短缺,我们的电脑大多处于内网环境,如何在外网访问内网电脑,成为一个令人头疼的问题,下面我给大家推荐一个非常实用的方法。 1:访问快解析下载安装快解析服务器 2:运行软件,点击“…

2.4 输入和显示

本节必须掌握的知识点: 示例五源代码 代码分析 汇编解析 2.4.1 示例五 ■格式化输入函数scanf scanf函数可以从键盘读取输入的信息。scanf函数同样可以像printf函数那样,通过转换说明“%d”来限制函数只能读取十进制数。scanf函数的参数为可变参数…

LwIP 之九 详解 UDP RAW 编程、示例、API 源码、数据流

我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 UDP RAW 编程则是指的直接使用 LwIP 的最底层 UDP 接口来直接实现应用层功能。这里先来一张图,对 LwIP 内部…

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下,电商行…

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中,客户的收入和负债数据大多无法直接获得,对于个人的收入和负债数据&…

【JavaEE】Spring Boot 入门:快速构建你的第一个 Spring Boot 应用

目录 第一个SpringBoot程序介绍项目创建创建项目目录介绍输出Hello World 第一个SpringBoot程序 介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring 我们看下Spring官⽅(https://spring.io/)的介绍 可以看到, Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单…

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…

用balenaEtcher烧录ubuntu的iso文件都失败,所以选用了另一种烧录的软件Rufus,然后烧录成功了+安装ubuntu的坑

https://releases.ubuntu.com/bionic/进入网页下载ubuntu 选择烧录软件将下载的Ubuntu烧录到U盘中 之前用这个U盘烧录过一次,成功了,后来应该是U盘受损或者是什么其他原因使得用这个U盘总是烧录失败 换思路:由于一直使用balenaEtcher烧录ubu…

WebView基础知识以及Androidx-WebKit的使用

文章目录 摘要WebView基础一、启动调整模式二、WebChromeClient三、WebViewClient四、WebSettings五、WebView和Native交互 Androidx-WebKit一、启动安全浏览服务二、设置代理三、安全的 WebView 和 Native 通信支持四、文件传递五、深色主题的支持六、JavaScript and WebAssem…

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结,部分算法图解 环境 ubuntu20,ros 版本 noetic 运行测试 按照 readme 提示进行测试,跳过第一个步骤,并不需要 turtlebot3。 执行第三个 launch 报…

vue element checkbox的实现

实现多选非常简单: 手动添加一个el-table-column,设type属性为selection即可;默认情况下若内容过多会折行显示,若需要单行显示可以使用show-overflow-tooltip属性,它接受一个Boolean,为true时多余的内容会在 hover 时以…

数据挖掘原理与应用------分类预测

在数据挖掘和机器学习领域,TPR(True Positive Rate)是指在实际为阳性的情况下,模型正确预测为阳性的比例。TPR也被称为灵敏度(Sensitivity)或召回率(Recall)。它是评估分类模型性能的…

如何解决IntelliJ IDEA中pom.xml依赖项引发的安全漏洞黄线警告问题

背景 在开发过程中,当我们在pom.xml文件中添加依赖项时,经常会发现IntelliJ IDEA报出黄色警告线条,提示存在潜在的安全漏洞。警告的具体展现形式如下: 解决方案 首先,打开设置菜单界面,接着选择编辑器选…

vue3土味情话pinia可以持久保存再次修改App样式

我是不是你最疼爱的人-失去爱的城市 <template><div class"talk"><button click"getLoveTalk">土味情话</button><ul><li v-for"talk in talkStore.talkList" :key"talk.id">{{ talk.title }}<…

用 Supabase CLI 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…

基于gin框架的文件上传(逐行解析)

基于gin框架的文件上传(逐行解析)记录一下使用gin框架完成一个文件上传的功能&#xff0c;一下是实现该功能的代码&#xff0c;适合小白&#xff0c;代码都有逐行解释&#xff01; app.go: package routerimport ("chat/service""github.com/gin-gonic/gin&qu…

网络工程师练习题

网络工程师练习题 网桥怎样知道网络端口连接了那些网站?如果从端口收到一个数据帧,则将其源地址记入该端口的数据库当网桥连接的局域网出现环路时怎么办?运行生成树协议阻塞一部分端口。使用IEEE 802.1q协议,最多可以配置4094个VLAN。VLAN中继协议(VTP)有不同的工作模式,…

C++异常详解

文章目录 前言一、回顾C语言二、异常的概念三、异常的使用1.异常的抛出和捕获2.异常的重新捕获 三.异常安全与异常规范1.异常安全2.异常规范 四.自定义异常体系五.C标准库的异常体系六.异常优缺点练习题总结 前言 在本篇文章中&#xff0c;我们将会详细介绍一下有关C异常的讲解…