【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在线听,听茫,只来酷狗音乐!https://t1.kugou.com/song.html?id=5bDc5edCOV2


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

再见——

无处不在的Linux双向链表是一种在Linux内核中使用频繁的数据结构。它与传统的链表不同,不是将数据结构塞入链表,而是将链表节点塞入数据。这种设计初衷是为了解决不同数据类型作为链表数据节点对函数接口和封装的影响。这使得在内核中使用链表的操作变得简单且高效。 在Linux中,双向链表的重要性体现在很多方面。例如,在内核中使用链表来管理进程、文件描述符、内存块等重要的数据结构。通过使用双向链表,可以方便地插入、删除和遍历这些数据结构,提高了内核的性能和可维护性。 Linux双向链表的特点是它是一个完整的环形链表,没有明确的头结点或尾结点的概念。在遍历链表时,可以从任意一个节点开始,沿着指针逐个访问下一个节点,直到重新回到起始节点。因此,不需要特别的头或尾结点,每个进程仅需要指向链表中某个节点的指针,就可以操作链表了。这种设计简化了链表的操作,提高了效率。 总结来说,无处不在的Linux双向链表是一种在Linux内核中广泛使用的数据结构,它通过将链表节点嵌入数据中,提供了简单高效的操作方式。这种设计解决了不同数据类型对函数接口和封装的影响,使得内核中对进程、文件描述符、内存块等重要数据结构的管理更加方便和高效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [linux源码内核双向链表文件](https://download.csdn.net/download/qq_18376583/86770056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux双向链表()——基础操作增、删、改](https://blog.csdn.net/my_live_123/article/details/16966401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云边有个稻草人

您的鼓励是我最大的动力,感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值