二维数组 和 变长数组

在上一期的内容中,为诸君讲解到了一维数组,在一维数组的基础上,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语言中的一大拦路虎——指针,也就是我们俗称的“ 地址 ”息息相关,所以还望诸君一定引起重视。鄙人这两天就被指针搞得焦头烂额,唉,难搞哟,革命尚未成功,同志仍需努力!多的不唠了,加油加油,咱们也下期再见,与诸君共勉!!! 

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

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

相关文章

springboot项目打包部署

springboot打包的前提条件jdk必须17以后不然本地运行不来(我用的jdk是22) 查看自己电脑jdk版本可以参考(完美解决Windows10下-更换JDK环境变量后,在cmd下执行仍java -version然出现原来版本的JDK的问题-CSDN博客) 1、…

uniapp音乐播放整理

一、前置知识点 1.1 音频组件控制-uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象。 主要用于当前音乐播放; 1.1.1 innerAudioContext属性 属性类型说明只读平台差异说明srcString音频的数据链接,用于直接播放…

学浪app的课程怎么导出来

在这个知识如星辰般璀璨的时代,学浪app汇聚了无数智慧的火花,点亮了求知者的前行之路。你是否曾在学浪的海洋中遨游,汲取知识的甘露,却渴望将那些珍贵的课程内容,如同宝藏一般,从数字的海洋中提取出来&…

PY32F403系列单片机,32位M4内核MCU,主频最高144MHZ

PY32F403系列单片机是基于Arm Cortex-M4核的32位通用微控制器产品。内置的FPU和DSP功能支持浮点运算和全部DSP指令。通过平衡成本,性能,功耗来获得更好的用户体验。 PY32F403单片机典型工作频率可达144MHZ,内置高速存储器,丰富的…

Python-VBA函数之旅-str函数

目录 一、str函数的常见应用场景 二、str函数使用注意事项 三、如何用好str函数? 1、str函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、str函数的常…

【C -> Cpp】由C迈向Cpp (5)

标题:【C -> Cpp】由C迈向Cpp(5) 水墨不写bug (图片来源于网络) 不抵制失败,携手失败,迈向成功 正文开始: (一)深入理解构造函数 在之前的讲解中&#x…

安装Ununtu后常见问题(无法远程连接、root密码等)

安装Ununtu后常见问题(无法远程连接、root密码、无法ifconfig等) 提示:安装完Ununtu系统后会遇到一些常见的问题,本文一次洗解决 文章目录 安装Ununtu后常见问题(无法远程连接、root密码、无法ifconfig等)一…

Linux(Ubuntu24.04) 安装 MinIO

本文所使用的 Ubuntu 系统版本是 Ubuntu 24.04 ! # 1、下载 MinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio# 2、添加可执行权限 chmod x minio# 3、导出环境变量,用于设置账号密码,我设置的账号和密码都是 minioadmin export MI…

PyQt5中的QtDesigner窗口

文章目录 1. 简介2. QtDesigner的MainWindow2.1 创建MainWindow2.2 添加组件2.3 预览2.4 查看对应的Python代码2.5 保存窗口并命名为login.ui,如下所示2.6对ui文件进行转换得到.py原件 3. 窗口常用属性及说明3.1 设置对象名称3.2 改变标题名字3.3 修改窗口大小 4. 更…

PyCharm 集成 Git

目录 1、配置 Git 忽略文件 2、定位Git 3、使用pycharm本地提交 3.1、初始化本地库 3.2、添加到暂存区 3.3、提交到本地库 3.4、切换版本 4、分支操作 4.1、创建分支 4.2、切换分支 4.3、合并分支 5、解决冲突 1、配置 Git 忽略文件 作用:与项目的实际…

conan2 基础入门(04)-指定编译器(gcc为例)

conan2 基础入门(04)-指定编译器(gcc为例) 文章目录 conan2 基础入门(04)-指定编译器(gcc为例)⭐准备生成profile文件预备文件和Code ⭐使用指令预览正确执行结果可能出现的问题 ⭐具体讲解conancmake ENDsettings.yml ⭐准备 生成profile文件 # 生成默认profile文件&#xf…

【userfaultfd+条件竞争劫持modprobe_path】TSGCTF 2021 -- lkgit

前言 入门题,单纯就是完成每日一道 kernel pwn 的 kpi 😀 题目分析 内核版本:v5.10.25,可以使用 userfaultfd,不存在 cg 隔离开启了 smap/smep/kaslr/kpti 保护开启了 SLAB_HADNERN/RANDOM 保护 题目给了源码&…

使用IDA自带python patch的一道例题

首先看见就是迷宫 迷宫解出的路径,放在zip的文件可以得到一个硬编码 然后在原程序中,有一处很离谱 这个debugbreak就是IDA分析错误导致的 我们点进去发现里面全是nop 然后我们把我们得到的硬编码放在010里面,再用IDA打开 重新编译看汇编 你…

Python---Numpy万字总结(2)

NumPy的应用(2) 数组对象的方法 获取描述统计信息 描述统计信息主要包括数据的集中趋势、离散程度和频数分析等,其中集中趋势主要看均值和中位数,离散程度可以看极值、方差、标准差等 array1 np.random.randint(1, 100, 10) …

音视频--AAC编码解析和示例

目录 1:AAC编码介绍 2:AAC格式介绍 3:AAC -ADTS帧组成 4:AAC-ADTS:(adts_fixed_header)格式介绍 5:AAC-ADTS:(adts_variable_header)格式介绍…

符合Misra C++标准且支持mmap的内存池管理模块

概述 定义内存管理的相关行为。使用了预分配的管理,先分配一块足够大的内存,然后需要时再从这块内存中进行分配。 代码仓库:https://gitee.com/liudegui/mem_pool 类之间的关系 模块名功能MemPool内存池模块入口,提供常用的模块…

HDFS- DataNode磁盘扩缩容

HDFS- DataNode磁盘扩缩容 背景: 缩减/增加节点磁盘 方案介绍: 采用hdfs dfsadmin -reconfig 动态刷新配置实现,不停服扩缩容。 注意事项: 请在进行缩容之前,务必了解实际的数据量,并确保磁盘有足够的空间来容纳这些数据。还需要考虑未来的使用需求,要预留一定数量的空间…

面向电商家居行业3D室内场景合成中的空间感知

本文主要介绍了3D场景合成技术在电商领域,尤其是家居家装行业的应用。它解释了如何使用3D场景合成创建逼真的室内设计,让消费者能够交互式地查看和体验产品,提高购物的趣味性和效率。文章提到了两种主要的3D室内场景生成算法:传统…

Curator分布式锁

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 分布式锁服务宕机,…

RZ9692实训开发通信系统构建(含配置json配置文件)

实验名称 通信系统的构建 实验目的: 实现一个通信系统的构建,要求传输两路正弦波,和一路视频信号,要求在接受端完整接受正弦信号和视频信号。 一、实验原理: 数字通信系统的一般模型: 数字通信系统的一…