程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!
👀 原来C语言多维数组这么好玩!带你轻松拿捏
在C语言的世界里,多维数组就像是神秘的宝藏迷宫,等着我们去探索其中的奥秘。今天,咱们就一起深入这个迷宫,揭开多维数组的神秘面纱,尤其是二维数组这个“明星成员”。准备好了吗?让我们出发!
1. 多维数组大揭秘
什么是多维数组呢?简单来说,二维数组、三维数组等等都属于多维数组的范畴。不过在这篇文章里,咱们重点聚焦在二维数组上,至于三维及以上的数组,理解了二维数组,它们也就触类旁通啦!
二维数组还有个很厉害的名字,叫做矩阵(matrix)。把它写成行(row)和列(column)的排列形式,你就能很形象地理解它的逻辑结构啦。想象一下,它就像一个整齐排列的表格,每一行和每一列都有着清晰的对应关系。
2. 定义方式大比拼
第一种:基础定义法
int a[3][4]; //二维数组
这里的二维数组a可以看成是由三个一维数组组成的,它们的数组名分别是a[0]、a[1]、a[2]。每个一维数组又各自有 4 个元素,比如一维数组a[0]的元素就是a[0][0]、a[0][1]、a[0][2]、a[0][3]。这样算下来,二维数组a一共有 12 个成员(3 x 4 = 12)。

二维数组结构示意图
那三维数组呢?也很简单:
int arr1[3][4][5]; //三维数组
这里有个小技巧哦:C 语言允许声明多维数组,有多少个维度,就用多少个方括号,比如二维数组就用两个方括号。
第二种:声明与初始化同步法
多维数组可以使用大括号,在声明的同时,一次性对所有成员赋值。
int a[3][4] = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
在这个例子中,a是一个二维数组,这种赋值写法就相当于把第一维的每个成员都写成了一个数组。

二维数组初始化示意图
这里还有个小代码来展示一下地址情况:
int main() {
int a[3][4] = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
printf("%p\n",a[0]); //0000006ac71ffd30
printf("%p\n",a[0] + 1); //0000006ac71ffd34
printf("%p\n",a[0] + 2); //0000006ac71ffd38
printf("%p\n",a[0] + 3); //0000006ac71ffd3c
printf("%p\n",a[0] + 4); //0000006ac71ffd40
printf("%p\n",a + 1); //0000006ac71ffd40
printf("%p\n",a[1]); //0000006ac71ffd40
printf("%p\n",a[1] + 1); //0000006ac71ffd44
return 0;
}
第三种:部分元素赋值法
多维数组也可以只给指定位置进行初始化赋值,没赋值的成员会自动设置为“零”值。
//指定了 [0][0] 和 [1][1] 位置的值,其他位置就自动设为 0 。
int a[2][2] = {[0][0] = 1, [1][1] = 2};
第四种:单层大括号赋值法
多维数组还能用单层大括号赋值。不管数组有多少维度,在内存里都是线性存储的。就拿a[2][2]来说,a[0][0]后面是a[0][1],再后面是a[1][0],以此类推。
int a[2][2] = {1, 0, 0, 2}; //会自动匹配到各行各列
第五种:简化赋值法
在第四种的基础上,如果对全部元素赋值,那么第一维的长度可以不给出。
//int a[2][3] = {1, 2, 3, 4, 5, 6};
//可以写为:
int a[][3] = {1, 2, 3, 4, 5, 6};
//也可以写为:
int a[][3] = {{1, 2, 3},{4, 5, 6}}; //行数自然判定为2
这里有个小练习,你来看看下面哪些赋值操作是正确的:
int arr1[3][2]={{1,2},{3,4},{5,6}}; //对应定义方式2
int arr2[3][2]={1,2,3,4,5,6}; //对应定义方式4
int arr3[][2]={1,2,3,4,5,6}; //对应定义方式5
int arr4[][2]={{1,2},{3,4},{5,6}}; //对应定义方式5
int arr5[][2]={1,2,3,4,5}; //对应定义方式5。未显式赋值的位置默认赋值为0
答案是:都对!你答对了吗?
不过要注意哦,在定义二维数组时,必须指定列数(即一行中包含几个元素)。
3. 二维数组内存大剖析
用矩阵形式(比如 3 行 4 列形式)表示二维数组,这只是逻辑上的概念,能很形象地表示出行列关系。但在内存中,各元素是连续存放的,并不是二维的,而是线性的。
在C语言里,二维数组中元素排列的顺序是按行存放的。也就是说,先顺序存放第一行的元素,再存放第二行的元素。(最右边的下标变化最快,第一维的下标变化最慢)。

二维数组内存存放示意图
就拿整型数组b[3][3]来说,它在内存中的存放情况是这样的:
![整型数组b[3][3]内存存放示意图](https://i-blog.csdnimg.cn/img_convert/4ec27c0baa2f084c7c7a88a713b142ce.png)
整型数组b[3][3]内存存放示意图
再看看关于长度的问题:
int b[3][3];
printf("%d\n",sizeof(b)); //36
printf("%d\n",sizeof(b)/sizeof(int)); //9
4. 二维数组遍历全攻略
二维数组的遍历格式是:数组名[下标][下标] 。和一维数组一样,多维数组每个维度的第一个成员也是从 0 开始编号的。
示例 1:给指定索引位置的元素赋值
int arr1[3][5];
//给指定索引位置的元素赋值
arr1[0][0] = 12;
arr1[3][4] = 5;
示例 2:查看数组元素的地址
int main() {
int arr2[3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("&arr2[%d][%d] = %p\n", i, j, &arr2[i][j]);
}
}
return 0;
}
输出结果如下:

二维数组元素地址输出示意图
好啦,关于C语言的多维数组就介绍到这里啦,希望你能好好掌握哦!如果你在学习过程中有任何疑问,或者有自己的小发现,欢迎在评论区留言分享。
觉得这篇文章有用的话,别忘了点赞和分享哦!咱们下次再见啦!
C语言多维数组的玩法与解析
355

被折叠的 条评论
为什么被折叠?



