C语言之二维数组(DAY13)

一、使用二维数组的场景

假如你还是那个班主任,需要知道整个班30名学生的成绩,而且每个班的学生分为6个学习小组,即每个组有5个学生,要将他们的成绩用数组保存下来方便日后观察学生的成绩变化,以此来观察学习小组的学习成果,用第一维表示第几个小组(作为行),第二维表示第几个学生(作为列)。如下图所示。

组员1组员2组员3组员4组员5
第一组86646468

43

第二组3185422345
第三组7697345665
第四组2323548654
第五组4353653553
第六组2265679634

二、二维数组的定义

二维数组的一般形式:

<数据类型> <数组名> [常量表达式1] [常量表达式2]

例如:int a[3][4]

定义a为3×4数据类型为整型的数组

三、二维数组的存储方式

其实二维数在内存的存储是一维的。

二维数组在C语言中的排列顺序是按行排放的,即在内存中先存放第1行的元素,再存放第2行的元素。如下图所示是a[3][4]数组存放的序列

a[3][4]

代码验证一下,是否如此?

#include <stdio.h>

int main()
{
	int a[2][3], i, j;//定义2行3列的数组
	for(i = 0;i < 2;i ++){
		for(j = 0;j < 3;j ++)
		printf("%p\n", &a[i][j]);
	}
	return 0;
}

运行结果:

0xbfc50398是a[0][0]的地址,0xbfc5039c是a[0][1]的地址……

确实如此!

四、二维数组元素的引用

1、二维数组元素的表达形式为:

数组名[下标][下标]

注意:在引用元素时,下标值应在已定义的数组大小的范围内。例如:int a[3][4];

声明行数时可以省略,但列数不可以。

2、二维数组初始化:

①分行初始化

例如:

int a[2][3] = {{1,2,3}{4,5,6}};
123456
a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]

②按元素列表顺序初始化

③对部分元素赋初始值

例如:

int a[2][3] = {{1}{6}};
第一列第二列第三列
a[0]1(a[0][0])0(a[0][1])0(a[0][2])
a[1]6(a[1][0])0(a[1][1])0((a[1][2]))

只对部分元素赋初值而省略第1维的长度(即忽略行数),例如:

int a[][3] = {{1,4,8}{5}};
第一列第二列第三列
a[0]1(a[0][0])4(a[0][1])8(a[0][2])
a[1]5(a[1][0])0(a[1][1])0((a[1][2]))

五、二维数组的经典例子

经典:打印杨辉三角形

什么是杨辉三角呢?

tips:不能一下子上来就敲代码的问题,要先打印出框架,再改数值。

比如说:通过观察,可发现:

(1)第一列和对角线上的数都是1;(这作为框架)

(2)从第三行起,除上面的第一个数和最后一个数外,其余数都是上一行同列和前一列两个数的和。(改变其他数的数值)

代码实现:

#include <stdio.h>

int main()
{
	int i,j;
	int a[10][10];
	// = {{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}};
	for(i = 0;i < 10;i ++){ 
		a[i][0] = 1;
		a[i][i] = 1;
	}

	for(i = 2;i < 10;i ++){
		for(j = 1;j < i;j ++){
			a[i][j] = a[i-1][j-1] + a[i-1][j];
		}
	}
	//打印模块
	for(i = 0;i < 10;i ++){
		for(j = 0; j <= i;j ++){
			printf("%d ", a[i][j]);
		}printf("\n"); 
	}printf("\n");
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值