二维数组| 学习笔记

简介: 快速学习二维数组

开发者学堂课程【你的第一门 C 语言课二维数组】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/444/detail/5470


二维数组


内容介绍:

一、 二维数组的定义

二、 二维数组的访问

三、 二维数组的初始化


一、二维数组的定义

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

图片31.png

B:

图片32.png

C:

图片33.png

这个概念模型图可以帮助我们更好的理解数组

5、在 c 语言中,内存语言是线性的,二维或者三维或者思维数组内存中的存放都是线性的

6、案例:int b[4][5];//定义一个二维数组

//内存存放图

首先是一维数组,第二行就是二维数组存放图

图片34.png

每一个元素包含其他的5个元素,这就是二维数组

每一个元素再放一个一维数组,相当于一维数组的嵌套

案例:要计算一个班4个科目的成绩

图片35.png

一维数组:

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 .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 .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 .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

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])

}

和上面代码对比

相关文章
|
7月前
|
存储 算法 搜索推荐
15一维数组
15一维数组
64 0
【一维数组和二维数组】
【一维数组和二维数组】
60 0
|
7月前
|
存储 C++ 计算机视觉
C++程序二维数组:深入理解与实践
C++程序二维数组:深入理解与实践
83 1
|
7月前
|
存储 C语言
二维数组的使用
这篇内容介绍了二维数组的概念,它是将一维数组作为元素构成的数组,也称为多维数组。文章详细讲解了如何创建二维数组,包括指定行数和列数,并展示了不同类型的初始化方式:不完全初始化(剩余元素设为0)和完全初始化。此外,还提到了按照行初始化的语法。内容中强调了C语言中二维数组的行和列都从0开始计数,并通过示例解释了如何访问和输出数组元素。最后,讨论了二维数组在内存中的存储方式,它是一维数组数组,元素在内存中是连续存放的。
73 0
|
7月前
|
存储 算法 搜索推荐
16二维数组
16二维数组
46 0
|
7月前
|
存储 算法 C++
C++013-C++二维数组
C++013-C++二维数组
C++013-C++二维数组
|
存储
二维数组剖析
二维数组剖析
54 0
|
7月前
|
C语言
二维数组的知识
二维数组的知识
|
存储 C语言
一维数组剖析
一维数组剖析
51 0
二维数组的大小
int a[ 3 ] [ 4 ] 数组类型:int [ 3 ] [ 4 ],去掉变量名,就是变量的类型。这就是3行4列共12个int 类型元素的二维数组类型。
166 0