内容介绍:
一、二维数组的定义
二、二维数组的访问
三、二维数组的初始化
一、二维数组的定义
1、如果点是一个单独的变量,那么线就是一个数组,数组就是一堆紧挨着的存放在一起的变量。一维数组其实就是一个点,二维数组其实就是一个面
2、随着开发的深度,发现有些情况下,一维数组有时很难满足需求,但引入二维数组的概念之后问题就可以变得简单许多。
3、比如存放综合成绩,如果使用二维数组只需要定义一个数组,二维数组通常称之为矩阵,将二维数组写成行和列表示的形式可以解决很多问题。
4、定义方法:
使用方括号来指定每一个元素的个数
类型 数组名[常量表达式][常量表达式]
int a[6][6];// 6*6,定义一个6行6列的二维数组
char b[4][5]; 1/ 4*5,定义一个4行5列的二维数组
double c[6][3];1/ 6*3,定义一个6行3列的二维数组
概念模型图分别是:
A:
B:
C:
这个概念模型图可以帮助我们更好的理解数组
5、在c语言中,内存语言是线性的,二维或者三维或者思维数组内存中的存放都是线性的。
6、案例:int b[4][5];//定义一个二维数组
//内存存放图
首先是一维数组,第二行就是二维数组存放图
每一个元素包含其他的5个元素,这就是二维数组
每一个元素再放一个一维数组,相当于一维数组的嵌套
案例:要计算一个班4个科目的成绩
一维数组:
int chinese [50];
int math[50] ;
int english[50];
int comprehensive[50] ;
二维数组:
int score[4][50];
score[0][0] = 80; .
score[1][0] = 78;
score[2][0] = 67;
score[3][0] = 88;
由此可见二维数组只需要定义一个就可以解决了,在这个问题中比一维数组更加简单,有效
三维数组就关系到长宽高了,就例如游戏中的人物模型
二、二维数组的访问
格式:数组名[下标][下标]
a[0][0];//访问a数组中第1行第1列的元素
b[1][3];//访问b数组中第2行第4列的元素
c[3][3];//访问C数组中第4行第4列的元素
注意:
同样需要注意下标的取值范围,以防止数组的越界访问。
比如int a[3][4],那么就是3x4列的二维数组,其“行下标”的取值范围是0~2,“列下标”的取值范围是0~3,超出任何一个下标的访问都是越界访问。
C语言的越界访问是一重大灾难,因为没有越界的检查,初学者很容易出错,所以一定要避免。
三、二维数组的初始化
1、由于二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内:
int a[3][4]= {1, 2,3,4, 5,6,7,8,9,10,11,12};
2、案例:
#include <stdio.h>
int main( )
//定义变量数组
int a[3][4] = {1, 2,3,4,5,6,7,8,9,1,11,12};
int I,j;
//for循环进行遍历
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d”,a[i][j]);
printf("\n");
}
return 0;
}
保存运行:gcc test1.c && ./a.out
结果:
1 2 3 4
5 6 7 8
9 1 11 12
3、为了更直观地表示元素的分布,可以用大括号将每一行的元素括起来:
int a[3][4]={1,2, 3,4},{5, 6,7,8},{9,10,11,12};
为了避免访问困难
或者
int a[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
虽然占了更多的空间,但是更加符合我们的想法
二维数组也可以仅对部分元素赋初值:
int a[3][4] ={{1},{5],{9}3;
案例:
#include <stdio.h>
int main( )
//定义变量数组
//测试159的值都赋值在哪了
int a[3][4] = {{1},{5},{9}};
int I,j;
//for循环进行遍历
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d”,a[i][j]);
printf("\n");
}
return 0;
}
保存运行:gcc test1.c && ./a.out
结果:
1 0 0 0
5 0 0 0
9 0 0 0
结论:是把前三行每一行的第一列赋值为159,没有赋值的用0填充,一个大括号表示一行
如果希望整个二维数组初始化为0,那么直接在大括号里写一个0即可:
int a[3][4] ={0};
数组如果没有进行初始化,就会出现随机的值
C99同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:
int a[3][4]={[e][0] = 1,[1][1]=2,[2][2]=33;
案例:
#include <stdio.h>
int main( )
//定义变量数组
//测试159的值都赋值在哪了
int a[3][4] = {[0][0]=1,[1][1]=2,[2][2]=3};
int I,j;
//for循环进行遍历
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d”,a[i][j]);
printf("\n");
}
return 0;
}
保存运行:gcc test1.c && ./a.out
结果:
1 0 0 0
0 2 0 0
0 0 3 0
二维数组的初始化也能偷懒,让编译器根据元素的数量计算数组的长度。但只有第1维的元素个数可以不写,其他维度必须写上:不然就会报错。
int a[][4] = {1,2, 3,4},{5, 6,7,8},{9,10,11,12}];
int a[][] = {1,2, 3,4},{5, 6,7,8},{9,10,11,12}];
这种就会报错
计算成绩案例:
#include <stdio.h>
int main()
int a[4][5] = {
{80,92,85,86,99},
{78,65,89,70,99},
{67,78,76,89,99},
{88,68,98,90,99}
};
int i, j;
for (i = 0 ; i< 4; i++)
{
for(j = 0; j< 5; j++)
printf(""%d ", a[i][j])
}
printf ("\n");
}
return 0;
}
保存运行:gcc test1.c && ./a.out
结果:
80,92,85,86,99
78,65,89,70,99
67,78,76,89,99
88,68,98,90,99
结论:
横向变纵向
纵向变横向只需要修改双重循环的值:
for (i = 0 ; i< 5; i++)
{
for(j = 0; j< 4; j++)
printf(""%d ", a[j][i])
}
和上面代码对比