程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!
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]
在内存中的存放:
再比如关于长度
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语言的多维数组就说到这里,要掌握哈