【C语言】二维数组(详解)

 

目录  

  1.  二维数组的创建  

  1.1  二维数组的概念  

  1.2  二维数组的创建  

  2.  二维数组的初始化  

  2.1  不完全初始化  

  2.2  完全初始化   

  2.3  按照行初始化  

  2.4  初始化时能省略行,但不能省略列  

  3.  二维数组的使用  

  3.1  二维数组下标  

  3.2  二维数组的输入与输出  

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

  5.  C99中的变长数组  

  6.  数组练习  

  ——————————宫崎骏动漫里的夏天—————————


 正文开始—— 

前言

  前面我们深入学习了一维数组的相关知识,现在我们开始二维数组的学习之旅吧!  

  1.  二维数组的创建  

  1.1  二维数组的概念  

前面学习的数组被称为一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这就是二维数组,二维数组作为数组元素的数组被称为三维数组,把二维数组以上的数组统称为多维数组

  1.2  二维数组的创建  

定义二维数组的语法如下:

1   type  arr_name [常量值1] [常量值2];

2   

3   例如:

4            int  arr [3][6];

5            double  data [5][6];

  • 3表示数组有3行 
  • 6表示数组有6列
  • int 表示数组中每个元素都是 int 类型
  • arr 是数组名,可以根据自己的需要指定名字

  2.  二维数组的初始化  

在创建变量或数组的时候,给定一些初始值,被称为 初始化

二维数组的初始化与一维数组一样,也是用大括号初始化的。

  2.1  不完全初始化  

1   int  arr1 [3][4] = {1,2};

2   int  arr2 [3][5] = {0}; 

arr1数组

  2.2  完全初始化   

1   int  arr [3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

  2.3  按照行初始化  

1   int  arr [3][5] = { {1,2}, {3,4}, {5,6} };

  2.4  初始化时能省略行,但不能省略列  

1   int  arr [][5] = { 1, 2, 3 };

2   int  arr [][6] = { 1, 2, 3, 4, 5, 6, 7, 8 };

3   int  arr [][7] = { {1, 2}, {3, 4}, {5, 6} };

  3.  二维数组的使用  

  3.1  二维数组下标  

二维数组的访问也是使用下标的形式,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素。

C语言规定,二维数组的行和列都是从0开始的。如下所示:

1   int  arr[3][5]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

arr数组

第一列表示行号,第一行表示列数,第二行第四列,锁定15。 

  3.2  二维数组的输入与输出  

我们已经知道了如何访问二维数组的单个元素,那我们如何访问整个二维数组呢?

我们只要有规律的产生行和列的数字就可以了,以上面 arr 数组为例,行的范围是0~2,列的范围是0~4,所以我们可以借助循环生成所有的下标。

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

像一维数组一样,我们想研究二维数组在内存中的存储方式,我们也可以打印出数组所有元素的地址。

如下:

从输出结果看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处( arr[0][4] 和 arr[1][0] )的两个元素之间也是相差4个字节,所以 二维数组中的每个元素都是连续存放的。

  5.  C99中的变长数组  

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小。

如:

1   int  arr1 [10];

2   int  arr2 [3+5];

3   int  arr3 [] = { 1, 2, 3 };

这样的语法限制,让我们创建数组的时候不够灵活,有时候数组大了浪费空间,数组小了又不够用。

C99中给一个变长数组的新特性,允许我们可以使用变量指定数组大小。如:

1   int n = 0;

2   int  arr[n];

上面的代码中,数组 arr 就是变长数组,因为它的长度取决于变量 n 的值,编译器没法实现确定,只能运行时才能知道 n 是多少。

【重点】

变长数组的根本特征,就是数组的长度只有运行时才能确定,所以变长数组不能初始化。它的长度是程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。有一个比较迷惑的点,变长数组的意思是数组的大小可以使用变量来指定的,在程序运行时,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的。数组的大小一旦确定就不能再改变了。 

遗憾的是,在VS2022上,虽然支持大部分C99的语法,但是不支持C99中的变长数组,没法测试。

  6.  数组练习  

题目:多个字符从两端移动,向中间汇聚

二维数组的学习就结束了,下来我们要好好练练习题才能对二维数组的掌握及其运用更加熟练。


完——

  ——————————宫崎骏动漫里的夏天—————————

茫_李润祺_高音质在线试听_茫歌词|歌曲下载_酷狗音乐酷狗音乐为您提供由李润祺演唱的高清音质无损茫mp3在线听,听茫,只来酷狗音乐!icon-default.png?t=N7T8https://t1.kugou.com/song.html?id=5bDc5edCOV2


期待我们下一次的共同学习!

再见——

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

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

相关文章

将Firefox插件导入Edge/Chrome中

目录 将Firefox插件导入Edge/Chrome中前言导出火狐插件.xpi格式插件导入edge/chorme中错误示范1错误示范2修改过程manifest.jsondict文件夹修改backgroundScript.jsinjectedScript.jsdebug过程最终backgroundScript.js和injectedScript.js代码 完工阶段修改后的源码 将Firefox插…

DS1338/PT7C4338串行实时时钟-国产兼容RS4C1338

RS4C1338串行实时时钟(RTC)是一种低功耗、全二进制编码十进制(BCD)时钟/日历加上56字节NV SRAM。地址和数据通过I2C接口串行传输。时钟/日历提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份,月末日…

这款神器可以让屏幕截图变为HTML代码!!【送源码】

今天的开源项目是「screenshot-to-code」——这就是那个能够将截图转化为HTML/JS/Tailwind CSS代码的项目。 利用GPT-4 Vision生成代码、结合DALL-E 3生成相似的图片。 「项目的独特之处:」 「1. 屏幕截图即代码:」 将屏幕截图瞬间转变为可运行的HTML/…

区间合并——Acwing.803区间合并

区间合并 定义 区间合并是指将一组有重叠或相邻的区间合并成一个或多个更大的区间。 运用情况 图像处理:在图像的区域分析中,可能需要将相邻的具有相似特征的区域进行合并。时间区间处理:比如将多个连续时间段进行合并。行程规划&#xf…

发布中文文档类资源仓库-ChineseDocumentPDF

引言 今天中午,排队打饭间隙,刷到新闻,说是:360AILAB-NLP团队开源了中文论文、研报文档场景的轻量化版式分析模型360LayoutAnalysis。 面向中文论文及研报两个场景的轻量化版式分析模型已经开源: Github地址&#x…

Gi标签管理

文章目录 前言理解标签创建标签操作标签总结 前言 理解标签 标签,可以理解为对某次commit的一次标识,相当于起起了一个别名。 例如,在项目发布某个版本时候,针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。 这有什…

论文《Federated Social Recommendation with Graph Neural Network》阅读

论文《Federated Social Recommendation with Graph Neural Network》阅读 论文概况IntroMethodology问题形式化FeSoG本地图设计本地差分隐私Pseudo-Item Labeling 模型优化模型训练 论文总结 论文概况 今天总结一下最近阅读的关于联邦社会化推荐的论文《Federated Social Rec…

第五讲:51单片机+RA8889驱动控制彩屏 完整源码说明 【 源码v1.2 】

51单片机驱动控制彩屏系列讲座 第一讲:单片机STC89C52RA8889驱动控制彩屏【 源码v1.0 】 第二讲:单片机STC89C52RA8889驱动控制彩屏 代码移植介绍 第三讲:单片机STC89C52RA8889驱动控制彩屏 代码的压缩(Keil编译器) 第…

phpstudy的安装dvwa

phpstudy安装dvwa 1. 下载phpstudy Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 2. 搭建dvwa靶场 下载地址:https://github.com/ethicalhack3r/DVWA/archive/master.zip 将其放入www文件夹中 3. 修改配置文件 将\DVWA-master\config中config.inc.php…

STL-常用容器

3.1.1. string基本概念 本质: string是C风格的字符串,char*是C语言风格的字符串string本质上是一个类 string和char*的区别: char*是一个指针string是一个类,类内部封装并负责管理char*,是一个char*型的容器 特点&a…

ISCC2024 winterbegins

首先,用IDA打开程序,看到一大堆while(1)又套着while(1)的结构,肯定是控制流平坦化了,我们可以使用IDA插件d810去掉。 现在程序就好看多了。如果IDA没有显示这堆中文字符串,可以考虑使用IDA8.3,就可以显示…

stm32_HAL_CAN(特点:广播试,检测线路是否空,id有优先级)

UART I2C SPI 介绍 CAN(Controller Area Network)接口是一种常用于嵌入式系统中的通信接口,尤其在汽车和工业领域。它由Robert Bosch GmbH在1986年开发,旨在提供一种可靠、高效、灵活的车载通信网络。CAN总线的主要 特点包括&am…

eNSP学习——配置高级的访问控制列表

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置Telnet 4、配置高级ACL控制访问 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PDF版_ensp配置命令大全资源-…

数据结构01 栈及其相关问题讲解

栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为“栈顶”,相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说,栈就像一个放乒乓球的圆筒,底部是封住的,如果你想…

【简单介绍下Sass,什么是Sass?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Linux:多线程的操作

多线程操作 进程与线程线程的创建 create_pthread创建线程池给线程传入对象的指针 线程等待 pthread_join退出线程 pthread_exit线程等待参数 retval 与 线程退出参数 retval 线程中断 pthread_cancel获取线程编号 pthread_self线程分离 pthread_detach 进程与线程 进程是资源…

史上最全,呕心沥血总结oracle推进SCN方法(八)

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。前面介…

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期 文章目录 17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期一、自动存储期示例 二、静态存储期2.1 示例 三、自定义存储期3.1 如何申请内存3.2 如何释放内存3.3 如何清空内存3.4 示例 概念…

MQTT通讯协议接入

1.MQTT协议概述 MQTT是一种基于发布/订阅模式的轻量级消息传输协议,常用于低带宽、不可靠网络环境下传输消息,适用于物联网设备之间的通信。 1.1 MQTT协议的组件 客户端(Client):连接到MQTT代理服务器的设备&#xff…

计算机组成原理(六)

0x12345678和12345678H都是指同一个十六进制,也就是12345678,不过是不同的编程语言的写法而已 具体来说,如果有 n 根地址线,计算机可以寻址的内存空间大小是 2^n 字节。 24根地址线: 如果一个系统有24根地址线,意味着它…