北京app网站开发,济南城市建设集团 网站,湖南省金力电力建设有限公司 网站,wordpress单主题大家好#xff0c;这里是小编的博客频道 小编的博客#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识#xff0c;希望能在这里与大家共同进步#xff0c;共同收获更好的自己#xff01;#xff01;#xff01; 本文目录 引言正文一 二维数组的创建1. 二维数组的… 大家好这里是小编的博客频道 小编的博客就爱学编程 很高兴在CSDN这个大家庭与大家相识希望能在这里与大家共同进步共同收获更好的自己 本文目录 引言正文一 二维数组的创建1. 二维数组的概念2. 二维数组的创建 二 二维数组的初始化1. 不完全初始化2. 完全初始化3. 按照行初始化 三 二维数组的使用1.二维数组的下标2.使用场景 四 二维数组在内存中的存储1.存储结构2.内存布局3.访问方式4.地址计算 快乐的时光总是短暂咱们下篇博文再见啦不要忘了给小编点点赞和收藏支持一下在此非常感谢 引言
在C语言中数组是一种非常重要的数据结构它允许我们存储固定大小的同类型元素集合。通过使用数组我们可以方便地处理大量数据提高程序的效率和可读性。数组的类型分为一位数组和二维数组还有多维数组而今天小编将要给大家介绍的是二维数组的相关知识。一起来看看吧 那接下来就让我们开始遨游在知识的海洋 正文 首先我们来看看二维数组的创建。 一 二维数组的创建 知其然才能知其所以然所以我们先来看看二维数组的概念。
1. 二维数组的概念 基本概念C语言的二维数组是一种用于存储具有行和列两个维度的数据集合的结构类似于数学中的矩阵。在定义时需要指定数组的行数和列数以及数据类型例如int array[3][4];表示一个包含3行4列的整型二维数组。每个元素都可以通过其唯一的行索引和列索引来访问和操作非常适合处理表格形式的数据。 相信看过小编上篇关于一维数组的介绍的宝子们对索引一词并不会感到陌生但这里的行索引和列索引又是什么难道是说明二维数组有两个不同功能的下标带着这个疑惑接着往下看。 知道这个二维数组的概念后我们再来学习二维数组的创建。
2. 二维数组的创建 由上易知格式为 数据类型 数组名[行数][列数] 而行索引就是用来访问二维数组的行数,列索引就是用来访问二维数组的列数。具体怎么访问我们之后再讨论。
以下为例
int arr[2][3];
double arr1[3][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} };而以下的二维数组的创建是错误的
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} };好好利用这个知识点可以在我们不知道我们将会创建多少个元素的二维数组但是知道列数时最大的节约内存空间但也可能造成语法错误。所以一定要牢记二维数组在创建时是可以省略行数的**但一定不能省略列数**。 和一维数组一样学完了二维数组的创建我们来学二维数组的初始化。
二 二维数组的初始化 初始化定义在创建变量或数组的时候给定一些初始值被称为 初始化。二维数组的初始化与一维数组一样也是用大括号初始化的。 同样地二维数组的初始化也分为不完全初始化和完全初始化我们先来看看不完全初始化是怎样的。
1. 不完全初始化 顾名思义不完全初始化就是数组元素并不全部进行赋值的赋值方式。 以下为例
#includestdio.h
int main(){int arr[2][3] { 1, 2, 3, 4, 5 };return 0;
}由上可知
该二维数组的行数和列数分别为【2】和【3】所以我们不难得出该数组的数组元素的总数为6,而我们可以看到小编这里只对5个元素进行了赋值是哪5个呢
我们用监视窗口看一下 由图可知
arr[0][0]arr[0][1]arr[0][2]arr[1][0]arr[1][1]被分别初始化为12345只有 arr[1][2]没被赋值。所以我们不难看出二维数组的初始化也是随着下标从小到大进行赋值的只不过这里的下标有行下标和列下标也就是行索引和列索引。并且似乎行索引对赋值顺序的决定作用更大。这里就先不深入讨论后文会细讲。 看完了二维数组的部分初始化我们再来学习二维数组的完全初始化。
2. 完全初始化 说白了就是对二维数组的全部元素进行了赋值。 以下为例
#includestdio.h
int main(){int arr[2][3] { 1, 2, 3, 4, 5, 6};return 0;
}这里同样用监视窗口看一下数组元素有没有被我们放进去初值 不出所料相信这对于聪明的宝子们还是很简单的。那就再接着往下看。 接下来的就是一维数组不具备的独特初始化方式按照行初始化。那一起来看看吧
3. 按照行初始化 其实借助这个方法的名字——按照行初始化我们不难想到这个初始化的方式是不是一行一行地赋初值 是的You are so good! ! ! 那该怎么达到我们想要的赋值效果呢 这就要使用{}这个东东了。
以下为例
#includestdio.h
int main(){int arr[2][3] { {1}, {2, 3}};return 0;
}如果没有使用{}此次的赋值结果由上可知应为arr[0][0] 1,arr[0][1] 2,arr[0][2] 3,arr[1][0] 0,arr[1][1] 0,arr[1][2] 0;
而使用了{}的实际结果如图
显然这里的效果就是我们猜想的结果。
按行初始化可以使得我们给二维数组初始化时更加灵活。 在学完了二维数组的创建及初始化后我们步入了二维数组的使用的学习。 三 二维数组的使用 当然学习二维数组的使用毫无疑问从二维数组的下标开始学起。
1.二维数组的下标 在C语言中二维数组可以被看作是一个表格或矩阵其中每个元素都有一个行号和列号。这些行号和列号就是所谓的下标也就是行索引和列索引的别称。而二维数组的下标也都是从零开始。 假设我们有一个二维数组 arr[m][n]则
m 表示数组的行数。n 表示数组的列数。
那么数组中的某个元素可以通过 arr[i][j] 来访问其中
i 是元素的行下标取值范围是 0 到 m-1。j 是元素的列下标取值范围是 0 到 n-1。
例如对于以下二维数组
int arr[3][4] {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};要访问第二行第三列的元素即数字7可以使用 arr[1][2]。
2.使用场景 基本使用场景1. 表示矩阵: 二维数组非常适合用来表示数学上的矩阵。矩阵的运算如加法、乘法可以很方便地通过遍历和操作二维数组来实现。2. 图像处理在图像处理中图像通常被表示为像素点的集合。一个二维数组可以用来存储图像的灰度值或颜色信息对于灰度图像每个元素可以是亮度值对于彩色图像可能需要三个二维数组分别存储红、绿、蓝通道的值。3. 动态规划问题许多动态规划问题可以用二维数组来记录中间结果。例如求解最长公共子序列LCS、最短路径等问题时通常会使用一个二维数组来保存已经计算过的状态。4. 网格和地图在游戏开发和其他应用中二维数组可以用来表示游戏世界中的网格或地图。每个元素可以代表网格中的一个单元格包含该单元格的信息如是否可通行、是否有障碍物等。5. 其他需要二维数据结构的场景 除了上述场景外还有许多其他问题也可以利用二维数组来解决。例如统计数据的表格、棋盘游戏的状态表示等。 哈哈宝子们是不是被吓了一跳小编在刚看到时也被吓了一跳。是不是觉得有很多没听过的专业名词没关系小编在之后的日子里会带着大家把这些“拦路虎”一一征服相信小编也请相信自己
在目前我们需要掌握的就是二维数组的遍历。
如何遍历这里小编就以最简单的例子按行打印二维数组为例抛砖引玉
#includestdio.h
int main(){int arr[2][3] {1, 2, 3, 4, 5, 6};int i 0;int j 0;for (i; i 2; i) {for (j; j 3; j) {printf(%d , arr[i][j]);}printf(\n);}return 0;
}虽然例子简单但小编想让大家感受到的是
一般我们在遍历二维数组时都会使用两个整型变量i和j并初始化为0。至于为什么初始化为0这也是因为C语言的数组的下标从0开始且一般会使用两个循环以for循环最为常见进行遍历
由于现在我们还处于初识二维数组的阶段所以对二维数组的使用暂讲到这大家理解完本文可以多去一些刷题网站 加深理解哦 那现在就让我们进入本文的最后一章节—— 二维数组在内存中的存储
四 二维数组在内存中的存储 这里小编就先从二维数组在内存中的存储结构开始讲起哈。
1.存储结构 从本质上看二维数组可以被视为“数组的数组”。也就是说它是一个一维数组的集合其中每个元素本身又是一个一维数组。例如int array[3][4]; 表示一个包含3个元素的二维数组而每个元素都是一个包含4个整数的一维数组。 所以我们引申得到arr[0]是第一行数组元素的数组名。这很重要在我们后面理解一维数组和二维数组的数组名有大用。 接着是内存布局
2.内存布局 在内存中二维数组是连续存储的。具体来说二维数组的所有元素都按照行优先的顺序排列。这意味着首先存储第一行的所有元素紧接着是第二行的所有元素以此类推直到最后一行。这种存储方式使得我们可以通过简单的指针运算来访问数组中的任何元素。 这里小编也可以通过打印出一个二维数组的元素的所有地址验证上述说法
#includestdio.h
int main(){int arr[2][3] {1, 2, 3, 4, 5, 6};int i 0;int j 0;for (i; i 2; i) {for (j; j 3; j) {printf(%p\n, arr[i][j]);}printf(\n);}return 0;
}运行结果为 注
在64位机器现在的大部分计算机中地址的大小是8个字节%p’占位符打印的是十六进制表示下的地址两个十六进制位数字就占用一个字节
所以我们不难发现整形数组的相邻数组元素首字节地址大小相差4个字节也就是一个整型数据的大小。
所以我们可以得出
二维数组的元素在内存中的存储是连续的也就是紧挨着的。这和一维数组是一样的 再接着来看看二维数组的访问方式。
3.访问方式 由于二维数组在内存中是连续存储的因此我们可以使用双重循环嵌套循环来遍历整个数组。外层循环用于迭代行内层循环用于迭代列。通过指定行索引和列索引我们可以轻松地访问或修改数组中的特定元素。 例
#includestdio.h
int main(){int arr[2][3] {1, 2, 3, 4, 5, 6};int i 0;int j 0;arr[1][2] 7;for (i 0; i 2; i) {for (j 0; j 3; j) {printf(%d , arr[i][j]);}printf(\n);}return 0;
}运行结果为
我们这就通过二维数组的下标索引访问并修改了特定的元素的值。 最后我们来看看二维数组的地址计算。
4.地址计算 在C语言中数组名表示的是数组首元素的地址。对于二维数组来说这个首元素实际上是一个指向其第一行第一个元素的一维数组的指针。因此如果我们知道数组的首地址以及目标元素的行索引和列索引就可以计算出该元素的内存地址。这通常涉及到一些基本的算术运算如乘法用于跳过前面的行或元素和加法用于定位到具体的元素。 假设这有一个二维数组arr[2][3];如果我们知道了首元素arr[0][0]的地址那其他的元素的地址就可以很好的算出。不妨假设arr[0][0] 0000000000000000则arr[1][2] 0000000000000018。
为什么这就需要宝子们自己思考啦理解这题就掌握了这节知识——二维数组的内存布局和地址计算。
总的来说C语言的二维数组在内存中是以连续的方式存储的这使得它们非常适合于需要快速访问和修改大量数据的场景。 快乐的时光总是短暂咱们下篇博文再见啦不要忘了给小编点点赞和收藏支持一下在此非常感谢