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的进一步发展和研究方向
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

