C语言基础——数组(2)
ʕ • ᴥ • ʔ
づ♡ど
🎉 欢迎点赞支持🎉
个人主页:励志不掉头发的内向程序员;
专栏主页:C语言基础;
文章目录
前言
一、二维数组的创建
1.1 二维数组的概念
1.2二维数组的创建
二、二维数组的初始化
2.1 不完全初始化
2.2 完全初始化
2.3 按照行初始化
三、二维数组的使用
3.1二维数组的下标
3.1二维数组的输入和输出
四、二维数组的内存存储
五、C99中的变长数组
总结
前言
小伙伴们好啊,我们上一章节讲述了一维数组的各种基本语法,明白了一维数组的创建及输入输出以及销毁等,不知道大家有没有想过,数组难道只有一维嘛,有没有更高维,它们又是什么样子的呢,高维数组又有什么作用,那就让我们一起来看看吧。
一、二维数组的创建
1.1 二维数组的概念
我们之前学到了一维数组,数组里面储存的元素是我们计算机的内置类型,而我们把一维数组整体当作一个数组元素,很多个这样的数组的组合就是二维数组,如果我们把二维数组当作一个数组元素同理可得出三维数组,二维数组以上统称为多维数组。

1.2二维数组的创建
我们来看看二维数组的创建方式
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
char ch[4][3];
如上我们可以总结出以下几点:
1.数据类型,如 int arr[3][5] 的数据类型就是int型,也就是说它里面的各个元素都是int型。
2.我们可以知道arr后面带了两个常量值,这其中的常量值1表示的是有几行,而常量值2则是表示有几列,如我们上面的那张图片就是3行5列的二维数组,所以就是arr[3][5]。
3. 像arr呀,ch呀,都是数组名,是自己所赋予的最好是有意义的名字。
二、二维数组的初始化
我们在创建变量的时候进行赋值叫做初始化,二维数组的初始化和一维数组是相同的,都是用大括号进行初始化。
2.1 不完全初始化
和一维数组类似,但是又不完全相同,二维数组的初始化如果不完全的话,计算机也是会默认没有初始化的部分是为0的,我们可以来观察一下。
int main()
{int arr[3][5] = { 1, 2, 3, 4, 5 };return 0;
}
这是一个3行5列的二维数组,而且数组类型是int型。

我们可以在监视的地方看到,arr这个二维数组是由三个一维数组组成的,而我们初始化先对二维数组里的第一个一维数组进行初始化,等一维数组的数据满了以后才会对第二个数组进行初始化,如果没有初始化的地方,计算机是默认为0的。那有没有什么办法能给我们二维数组中的第一个一维数组没满的情况下也能在第二个一维数组里输入元素呢,当然可以,我们可以在大括号里面再加一个大括号来区分二维数组和一维数组。
int main()
{int arr[3][5] = { {1, 2, 3}, {2, 3, 4}, {3, 4, 5} };return 0;
}
如图所示,我们可以在大括号里面再加一个大括号用来表示二维数组的元素,也就是一维数组。

我们可以看到,它们每一个一维数组都不完全初始化了,这就是二维数组的不完全初始化。
2.2 完全初始化
二维数组的完全初始化和一维数组差不多,就是把每个元素都初始化,但是我们可以用大括号来区分不同二维数组的元素。
int main()
{int arr[3][5] = { {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7} };return 0;
}
2.3 按照行初始化
按行初始化本质上就是用大括号把二维数组的各个元素,也就是一维数组区分开来,然后再进行初始化,因为一维数组的个数即是行数。
另:我们知道一维数组可以省略数组名后面[ ]里的常量值,可以由计算机来计算常量值应该是多少,二维数组也是同理的,但是它不能两个[ ]里的都省略,它只能省略前面的内容而不能省略后面的内容,也就是它只能省略行而不能省略列,如果都省略掉行,计算机可以通过计算来知道应该有几行,但是如果省略掉列,那计算机就没办法知道一个元素内该赋予多少个值。所以只能省略行而不能省略列。
三、二维数组的使用
我们明白了二维数组的创建方式,那么二维数组该如何使用呢,它的使用方式和一维数组一样吗,我们接下来看看。
3.1二维数组的下标
我们都知道,二维数组是分为行和列的,数组名后面的第一个[]表示的就是行数,第二个[]表示的就是列数,所以说它把里面的每个元素都按行按列给了下表。

我们创建一个这样的三行五列的二维数组,它本质上是这个样子的。

它和一维数组相同,下标都是从0开始到n-1的,像元素1的下标就是0,0,我们想取1出来就让计算机输入arr[0][0]即可。

如果想取这个4,那就是arr[1][2],是先行再列,不是先列再行。
3.1二维数组的输入和输出
我们知道了一维数组的输入和输出主要是运用循环的方式实现的,那二维数组呢?二维数组不就是在一维数组的基础上增加了几行嘛,我们依然可以用循环来实现二维数组。
我们可以使用循环的嵌套,一个循环来控制二维数组的行数,一个循环来控制二维数组的列数,就如图所示,
int main()
{//输入int arr[3][5] = { 0 }; // 这是一个三行五列的二维数组for (int i = 0; i < 3; i++) //用来控制二维数组的行,遍历一边。{for (int j = 0; j < 5; j++) //用来控制二维数组的列,遍历一边。{scanf("%d", &arr[i][j]);}}//当j遍历了一边后i++,这样就实现了遍历二维数组,我们在//它每个元素进行输入,这就是二维数组的输入。//输出for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
这样我们就实现了二维数组的输入和输出。

四、二维数组的内存存储
我们在表现二维数组的时候是张这个样子的,

但是二维数组在内存存储的过程中是什么样子的呢,是不是连续的呢,我们可以来看一下,具体的办法和一维数组相同。我们来看一下它们的地址。
int main()
{int arr[3][5] = { 0 };for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

我们可以看到它们不但每个一维数组内连续的,而且数组之间的内存也是连续的,它在内存中的样子应该是这个样子的,

元素与元素之间在内存上是连续的,和一维数组是一样的。
五、C99中的变长数组
在C99标准前,C语言的在创建时只能用常量或者常量表达式,如
int arr[5] = { 0, 1, 2, 3, 4 };
int arr[2 + 3] = { 0, 1, 2, 3, 4 };
int arr[ ]= { 0, 1, 2, 3, 4 };
这样的语法限制让我们在创建数组的时候就很不灵活,如果创建大了就浪费空间,如果创建小了那就不够用,所以在C99中就引入了一个变长数组的特性,允许我们可以使用变量来指定数组大小。变长数组只是说我们可以用变量来改变数组,而不是说我们可以让数组任意变长变短。
int main()
{n = a + b;int arr[n] = { 0 };return 0;
}
遗憾的是vs2022虽然引用了很多C99的语法,但是变长数组却没有,所以这里就当了解一下吧。
总结
以上就是数组的全部内容,其实数组的本质是指针,这个我们在指针时再讲,我们接下来就开始来聊聊函数啦,感谢大家的观看,如果有错误请指出,我一定马上更正,谢谢大家。
相关文章:
C语言基础——数组(2)
ʕ • ᴥ • ʔ づ♡ど 🎉 欢迎点赞支持🎉 个人主页:励志不掉头发的内向程序员; 专栏主页:C语言基础; 文章目录 前言 一、二维数组的创建 1.1 二维数组的概念 1.2二维数组的创建 二、二维数组…...
封装PHP用于发送GET和POST请求的公共方法
封装了ThinkPHP用于发送GET和POST请求的公共方法。这个方法可以放在你的公共函数文件中,或者创建一个独立的类来管理这些请求。 <?php namespace app\common\utils;use think\facade\Log; use think\exception\HttpException;class HttpRequest {/*** 发送GET请…...
MongoDB~基础知识记录
为何要学Mongodb 工作以来,使用最多、了解最多的是MySQL。但技术的发展一定是依据痛点来的,就比如我遇到的痛点,一个业务、一个平台能力、存储的一个对象,随着产品和运营的需求,不断的进行变更,每一次的变…...
DSP28335模块配置模板系列——ADC配置模板
一、配置步骤 1.使能并配置高速时钟HSPCLK、ADC校验 EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK 1; EDIS;EALLOW;SysCtrlRegs.HISPCP.all ADC_MODCLK; // HSPCLK SYSCLKOUT/(2*ADC_MODCLK)ADC_cal();EDIS; 这里ADC_MODCLK3,所以HSPCLK时钟为150/625Mhz 2.配…...
字符串转换为字节数组、16进制转换为base64、base64转换为字符串数组、base64转换为16进制(微信小程序)
1、字符串转换为字节数组 // 字符串转为字节数组 function stringToByteArray(str) {var array new Uint8Array(str.length);for (var i 0; i < str.length; i) {array[i] str.charCodeAt(i);}return array; } 2、16进制转换为base64 // 16进制转换为base64 function H…...
c++中, 直接写浮点数, 是float 还是 double?
如果直接一个浮点数, 那么他默认是float还是double呢? 测试用例 #include <iostream> using namespace std;int main() {auto x 0.2;float f 0.2;double d 0.2;cout << "x Size : " << sizeof(x) << " bytes" << endl…...
C++核心编程友元的应用
文章目录 1.友元1.什么是友元2.全局函数做友元2.类做友元3.成员函数做友元 1.友元 1.什么是友元 在C中,友元(friend)是一种允许一个类或函数访问另一个类的非公有(private 或 protected)成员的机制。这种机制打破了类…...
C#,JavaScript实现浮点数格式化自动保留合适的小数位数
目标 由于浮点数有漂移问题,转成字符串时 3.6 有可能得到 3.6000000000001,总之很长的一串,通常需要截取,但按照固定长度截取不一定能使用各种情况,如果能根据数值大小保留有效位数就好了。 C#实现 我们可以在基础库里…...
Android基础-工程目录结构说明
Android工程的项目目录结构是开发Android应用时的基础,它组织和存储了应用的所有源代码、资源和配置文件。了解并熟悉这个目录结构对于提高开发效率和代码管理至关重要。下面将详细阐述Android工程的项目目录结构。 1. 工程根目录 Android工程的根目录通常包含多个…...
浅谈提示词发展现状,Prompt 自动优化是未来。
#封面手绘于本科期间,当年在知乎上写的第一篇关于 AI 的文章就用的这个封面,聊表纪念。 这次我们来聊聊 Prompt. 本来想取一个类似“提示词不存在了…”,或是“再见,Prompt 课程…”的标题,但最近很多大佬的谬赞让我感…...
揭秘智能测径仪省钱之道!每年能为每条产线省上百万!
在当今竞争激烈的市场环境下,企业们都在不断寻求提高生产效率、降低成本的方法。而智能测径仪的出现,为圆形钢材、螺纹钢等生产企业实现这一目标提供了有力的支持。 智能测径仪被广泛应用于高线、铸管、圆钢、螺纹钢、钢筋等的轧制生产线中,进…...
echaerts图例自动滚动并隐藏翻页按钮
效果图 代码 legend: {itemHeight: 14,itemWidth: 14,height: "300", //决定显示多少个// 通过 CSS 完全隐藏翻页按钮pageButtonItemGap: 0,pageButtonPosition: end,pageIconColor: transparent, // 隐藏翻页按钮pageIconInactiveColor: transparent, // 隐藏翻页按…...
OpenCV的小部件最基本范例
OpenCV也有与PYQT类似的小部件,例如滑块slider。OpenCV可以用与PYQT类似的“信号与槽”方法,也可以在函数中直接查询小部件的值。 import cv2 import numpy as npcv2.namedWindow(Show1) image np.zeros((100, 400, 3), np.uint8) # 创建一个空白内容…...
内置类型知多少?
内置类型(也称为基本类型或原生类型)是C/C本身定义的数据类型,它们直接由编译器支持,不需要用户自定义。 内置类型主要包括以下几类: 1.算术类型: (1)整型:int、short、long、lon…...
【C++题解】1090 - 同因查找
问题:1090 - 同因查找 类型:for循环、简单循环 题目描述: 求出 10 至 1000 之内能同时被2、3、7 整除的数,并输出。 每行一个。 输入: 无。 输出: 按要求输出满足条件的数,每行 1 个。 完…...
uni微信小程序editor富文本组件如何插入图片
需求 在editor中插入图片,并对图片进行编辑,简略看一下组件的属性,官网editor 组件 | uni-app官网 解决方案 首先要使用到ready这个属性,然后官网有给代码粘过来,简单解释一下这段代码的意思(作用是在不同…...
LabVIEW调用国产硬件DLL的稳定性问题及解决方案
在LabVIEW中调用国内公司提供的硬件DLL时,尽管可以运行,但常出现不稳定和bug问题,且厂家临时修改的版本未经长期测试。为确保稳定性和质量,需要制定系统化的测试和反馈机制、建立严格的版本控制、与厂家协作优化、并进行深入的自测…...
基础篇01——SQL的基本语法和分类
MySQL数据库安装与基本使用 安装教程参见:通过zip安装MySQL 通过命令行启动和停止MySQL服务命令 前提:安装MySQL成功之后 启动服务:net start mysql 停止服务:net stop mysql 通过命令行连接mysql 可以通过mysql的客户端命令行…...
HOW - 面试技巧系列 - 全英文面试
自我介绍 “can you tell me a little bit about yourself?” “please introduce yourself.” 工作经验 “can you describe your most recent job experience?” “how does your experience make you a good fit for this position?” 职业规划 “what are your l…...
【人工智能】第六部分:ChatGPT的进一步发展和研究方向
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...

