课程章节:
- 课程名称:物联网/嵌入式工程师
- 章节名称:第2周之第三讲 1-6 至 1-7 C语言中的二维数组、C语言中的二维数组代码实战
- 讲师姓名:大白老师
课程内容:
C语言中的二维数组
二维数组
含义
一维数组是相同数据类型元素的集合,但是只能表示一行数据。 若是存在行和列相关的信息(例如矩阵),我们就需要用二位数组来表示。
定义方式
数据类型 数组名[行数][列数]
;
示例用法:
int a[3][4]; //三行四列
在内存中按照还是按照一维数组的顺序排序的。
只不过,为了方便人们识别,我们是按照二维的来理解。
0xd10 1 a[0][0]
0xd14 2 a[0][1]
0xd18 3 a[0][2]
0xd1c 4 a[0][3]
0xd20 5 a[1][0]
0xd24 6 a[1][1]
0xd28 7 a[1][2]
0xd2c 8 a[1][3]
0xd30 9 a[2][0]
0xd34 10 a[2][1]
0xd38 11 a[2][2]
0xd3c 12 a[2][3]
//int a[5] int [5]
实际我们这里来写 int a[3][4]; //int a[3][4]
0 1 2 3
0 a[0][0] a[0][1] a[0][2] a[0][3]
1 a[1][0] a[1][1] a[1][2] a[1][3]
2 a[2][0] a[2][1] a[2][2] a[2][3]
结论
int a[3][2];
[1]a的类型: int [3][2]
[2]元素的表达方式:a[0][0],a[0][1],a[0][2] ...a[2][3]
[3]元素的个数: 行数 * 列数
[4]数组的大小: 元素的个数 * 一个元素的大小<===>6 * sizeof(a[0][0])<==>sizeof(a)
[5]数组最后一个元素: a[行数 - 1][列数 - 1]
[6]内存的存放方式:按行优先存放.
[7]定义二维数组的时候,行数可以省略不写,系统会根据默认
初始化元素的个数来分配对应的内存空间。但是列数一定要写。
(因为二维数组默认按行来进行优先存放的)
例如:
int a[3][4]; //true
int a[][4] = {1,2,3,4,5,6,7,8}; //true
//int a[3][] = {1,2,3,4,5,6,7,8,9}; //flase
// 123 1 2 3 4
// 567 5 6 7 8
// 789 9 0 0 0 //都是3行,有多种排列方式,系统不能识别。
// int a[][] = {1,2,3,4,5,6,7,8}; //flase
代码示例
#include <stdio.h>
int main()
{
int a[3][2];
int i = 0,j = 0;
/*
scanf("%d",&a[0][0]);
scanf("%d",&a[0][1]);
scanf("%d",&a[1][0]);
scanf("%d",&a[1][1]);
scanf("%d",&a[2][0]);
scanf("%d",&a[2][1]);
*/
printf("please input %d data : ",3 * 2);
for(i = 0;i < 3;i++) //0,1,2
{
for(j = 0;j < 2;j++)//0,1
{
scanf("%d",&a[i][j]);
}
}
for(i = 0;i < 3;i++) //0,1,2
{
for(j = 0;j < 2;j++)//0,1
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
二数组的初始化
完全初始化
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int b[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
部分初始化
int a[][3] = {1,2,3,4,5,6}; //true
//int a[3][] = {1,2,3,4,5,6}; //false
代码示例:
#include <stdio.h>
// a[0][0] a[0][1]
// a[1][0] a[1][1]
// a[2][0] a[2][1]
int main()
{
int a[3][2] = {{1,2},{3},{5,6}};
int i = 0,j = 0;
printf("please ouput %d data : \n",3 * 2);
for(i = 0;i < 3;i++)
{
for(j = 0;j < 2;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
学习笔记:
课后练习
练习
定义一个int a[10][10]的数组,利用二维数组输出下列杨辉三角的图案.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
...
代码:
#include <stdio.h>
#define M 10 // 行数
int main()
{
int a[10][10];
for (int i = 0; i < M; i++)
{
// 放中间 计算空格,以2个为一个单位
for (int j = 0;j <= M - i; j++)
{
printf (" ");
}
for (int j = 0; j <= i; j++)
{
// 不是首尾的数 = 上一行的数 + 上一行的上一列的数
a[i][j] = (i == j || j == 0) ? 1 : a[i - 1][j] + a[i - 1][j - 1]; //使用上一行计算
printf("%4d", a[i][j]);
}
printf("\n");
}
// 倒序 最后一行不要
for(int i = M-2; i >= 0; i--)
{
for (int j = 0;j <= M - i; j++)
{
printf(" ");
}
for (int j = 0;j <= i; j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
课程评价:
通过对知识的梳理,熟练掌握二维数组的定义。