Hi,您好,欢迎来到西安盛图软件科技有限公司!

C语言|二维数组的定义、初始化、赋值

发布时间:2023-11-09 14:31:08

一、二维数组的定义

二维数组定义的一般形式是:

dataType arrayName[length1][length2];

其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。

我们可以将二维数组看做一个 Excel 表格,有行有列,length1 表示行数,length2 表示列数,要在二维数组中定位某个元素,必须同时指明行和列。例如:

int a[3][4];

定义了一个 3 行 4 列的二维数组,共有 3×4=12 个元素,数组名为 a,即:

a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]

如果想表示第 2 行第 1 列的元素,应该写作 a[2][1]。

也可以将二维数组看成一个坐标系,有 x 轴和 y 轴,要想在一个平面中确定一个点,必须同时知道 x 轴和 y 轴。

二维数组在概念上是二维的,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。那么,如何在线性内存中存放二维数组呢?有两种方式:


在C语言中,二维数组是按行排列的。也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4)=48 个字节。

你可以这样认为,二维数组是由多个长度相同的一维数组构成的。

【实例1】一个学习小组有 5 个人,每个人有 3 门课程的考试成绩,求该小组各科的平均分和总平均分。

--MathCEnglish
张涛807592
王正华616571
李丽丽596370
赵圈圈858790
周梦真767785


对于该题目,可以定义一个二维数组 a[5][3] 存放 5 个人 3 门课的成绩,定义一个一维数组 v[3] 存放各科平均分,再定义一个变量 average 存放总平均分。最终编程如下:

#include <stdio.h>
int main(){
   int i, j;  //二维数组下标
   int sum = 0;  //当前科目的总成绩
   int average;  //总平均分
   int v[3];  //各科平均分
   int a[5][3];  //用来保存每个同学各科成绩的二维数组
   printf("Input score:\n");
   for(i=0; i<3; i++){
       for(j=0; j<5; j++){
           scanf("%d", &a[j][i]);  //输入每个同学的各科成绩
           sum += a[j][i];  //计算当前科目的总成绩
       }
       v[i]=sum/5;  // 当前科目的平均分
       sum=0;
   }
   average = (v[0] + v[1] + v[2]) / 3;
   printf("Math: %d\nC Languag: %d\nEnglish: %d\n", v[0], v[1], v[2]);
   printf("Total: %d\n", average);
   return 0;
}

运行结果:
Input score:
80 61 59 85 76 75 65 63 87 77 92 71 70 90 85↙
Math: 72
C Languag: 73
English: 81
Total: 75

程序使用了一个嵌套循环来读取所有学生所有科目的成绩。在内层循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内层循环(进入外层循环)后再把该累加成绩除以 5 送入 v[i] 中,这就是该门课程的平均分。外层循环共循环三次,分别求出三门课各自的平均成绩并存放在数组 v 中。所有循环结束后,把 v[0]、v[1]、v[2] 相加除以 3 就可以得到总平均分。

二、二维数组的初始化(赋值)

二维数组的初始化可以按行分段赋值,也可按行连续赋值。

例如,对于数组 a[5][3],按行分段赋值应该写作:

int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

按行连续赋值应该写作:

int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

这两种赋初值的结果是完全相同的。

【实例2】和“实例1”类似,依然求各科的平均分和总平均分,不过本例要求在初始化数组的时候直接给出成绩。

#include <stdio.h>
int main(){
   int i, j;  //二维数组下标
   int sum = 0;  //当前科目的总成绩
   int average;  //总平均分
   int v[3];  //各科平均分
   int a[5][3] = {{80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85}};

   for(i=0; i<3; i++){
       for(j=0; j<5; j++){
           sum += a[j][i];  //计算当前科目的总成绩
       }
       v[i] = sum / 5;  // 当前科目的平均分
       sum = 0;
   }

   average = (v[0] + v[1] + v[2]) / 3;
   printf("Math: %d\nC Languag: %d\nEnglish: %d\n", v[0], v[1], v[2]);
   printf("Total: %d\n", average);

   return 0;

}


运行结果:
Math: 72
C Languag: 73
English: 81
Total: 75

对于二维数组的初始化还要注意以下几点:

1) 可以只对部分元素赋值,未赋值的元素自动取“零”值。例如:

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

是对每一行的第一列元素赋值,未赋值的元素的值为 0。赋值后各元素的值为:
1  0  0
2  0  0
3  0  0

再如:

int a[3][3] = {{0,1}, {0,0,2}, {3}};

赋值后各元素的值为:
0  1  0
0  0  2
3  0  0

2) 如果对全部元素赋值,那么第一维的长度可以不给出。例如:

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

可以写为:

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


3) 二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,

上一篇:什么是数组?C语言数组的基本概念
下一篇:C语言|判断数组中是否包含某个元素