有了一维数组的基础,咱们来学习二维数组!!
一维数组连接:计算机科学类专升本复习之“一维数组“详解(初稿)_阿泉的博客-CSDN博客
首先 二维数组的一般形式为
int a[length1][length2]; 意思为: 数组类型 数组名 [下标1][下标2];
我们可以将二维数组看做一个 Excel 表格,有行有列
length1 表示行数,length2 表示列数
要在二维数组中定位某个元素,必须同时指明行和列。
例如 int a[3][4]; //定义一个3行4列的二维数组,共有 3*4=12个元素
分别为:
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 轴。
二维数组在概念上是二维的,但在内存中是连续存放的;
换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。
那么,如何在线性内存中存放二维数组呢?有两种方式:
1. 一种是按行排列,即放完一行之后再放入第二行;
2. 另一种是按列排列, 即放完一列之后再放入第二列。
但是在"C语言"中,二维数组是"按行"排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;
每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4)=48 个字节。
大家可以这样认为,二维数组是由多个长度相同的一维数组构成的。
举个例子吧,更容易理解!
//一个学习小组有 5 个人,每个人有 3 门课程的考试成绩,求该小组各科的平均分和总平均分。
姓名 数学 C语言 英语
康康 88 59 50
小王 99 88 77
老王 88 99 66
张三 87 65 99
李四 99 99 99
对于该题目,可以定义一个二维数组 a[5][3] 存放 5 个人 3 门课的成绩,//因为咱们C语言是按行来执行的,5人5行
定义一个一维数组 v[3] 存放各科平均分,
再定义一个变量 average 存放总平均分。
最终编程如下:
#include<stdio.h> int main() { int i,j;//定义二维数组的下标 int sum=0;//对学科成绩进行初始化,保证一开始成绩为0 int average; //总平均分 int v[3];//各科平均分 int a[5][3];//定义一个用来保存每个同学各科成绩的二维数组 printf("请分别输入每个人各科的成绩:\n"); //前面for循环的时候就讲到,必须掌握,到了数组才能玩得666,现在它来了 for(i=0;i<3;i++) { //这边解答一下,因为每个同学都有3们成绩,所以外层循环设置为"科目" for(j=0;j<5;j++) { scanf("%d",&a[j][i]);//输入每个同学的各科成绩,切记 & 别漏了 sum += a[j][i]; } v[i]=sum/5; //当前科目的平均分 sum=0;//对总成绩进行初始化,保证下一位的初试成绩为0 } average = (v[0]+v[1]+v[2])/3; printf(" 数学:%d \nC语言:%d \n 英语:%d \n",v[0],v[1],v[2]); printf("Toatl:%d\n",average); return 0; }
二维数组的初始化(赋值)
有两种
1. 按行"分段"赋值
eg:
int a[2][3]={{1,2,3},{8,9,8}};
2. 按行"连续"赋值
int a[2][3]={1,2,3,8,9,8};
这两种赋初值的结果是完全相同的。
这边咱们再来举个例子,依然是求各科的平均分和总平均分,不过本例要求在初始化的时候就要直接给出成绩
#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(" 数学:%d \nC语言:%d \n 英语:%d \n", v[0], v[1], v[2]); printf("Total: %d\n", average); return 0; }
对二维数组初始化 还需要 注意以下几点:
1. 可以只对部分元素赋值,未赋值的元素自动取"0"值
例如:
int a[3][3] = {{1},{2},{3}};
则是对每一行的第一列元素赋值,未赋值的元素的值为 0。
具体如下:
a[0][0]=1 a[0][1]=0 a[0][2]=0
a[1][0]=2 a[1][1]=0 a[1][2]=0
a[2][0]=3 a[2][1]=0 a[2][2]=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.二维数组可以看作是由 多个一维数组嵌套而成的;
如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。
一个二维数组也可以分解为多个一维数组。
例如:二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。