(一)二维数组的定义和初始化
定义二维数组arr[3][5]:
int arr[3][5] = { {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7} };
仔细看这个数组
arr[0]
是第一个一维数组,包含元素 arr[0][0], arr[0][1], arr[0][2], arr[0][3], arr[0][4]
arr[1]
是第二个一维数组,包含元素 arr[1][0], arr[1][1], arr[1][2], arr[1][3], arr[1][4]
arr[2]
是第三个一维数组,包含元素 arr[2][0], arr[2][1], arr[2][2], arr[2][3], arr[2][4]
实际上意味着这个二维数组包含3个一维数组,每个一维数组都包含5个int
类型的元素。
所以这个arr[3][5]其实是由3个包含5个元素的一维数组组成的
// 二维数组的初始化
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8 }; // 不完全初始化
// 1 2 3 4 5
// 6 7 8 0 0
// 0 0 0 0 0
// 从此例可以看出在二维数组初始化与一维数组初始化一样,当程序员没有给数组赋值时,会将空余元素自动补0
// 编译器会自动将{}内的元素自动按照制定的行列进行初始化,就算写成一维数组的方式,也是一样的
int arr1[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };// 完全初始化
// 1,2,3,4,5
// 2,3,4,5,6
// 3,4,5,6,7
// 按照行初始化
int arr2[3][5] = { {1,2},{3,4},{5,6} };
// 1 2 0 0 0
// 3 4 0 0 0
// 5 6 0 0 0
// 使用花括号对二维数组初始化,每行写在一个花括号里面,每行内的数据如果不完全,则自动补0
// 二维数组初始化可以省略行,不能省略列
// int arr3[3][] = {0};
int arr3[][5] = { 1,2,3,4,5,6,7,8 };// 2行5列
// 1 2 3 4 5
// 6 7 8 0 0
// 为什么不能省略列呢?
/*
因为如果只有行的话arr[3][] = {1,2,3,4,5,6,7,8};
编译器首先会定义第一行,1 2 3 4 ... 无法知道这一行有多少个元素,即不知道什么时候结束
结果是编译器报错,程序无法执行
同样,如果知道列数,不知道行数的话:
arr[][5] = {1,2,3,4,5,6,7,8};
编译器首先会定义第一行 1 2 3 4 5
再定义第二行 6 7 8 0 0
然后结束,将数组定义为2行5列的数组
两种写法的区别是编译器是否可以通过计算知道:8个整数可以完整地填充两个内层数组
*/
int arr4[][5] = { {1,2},{3,4},{5,6,7,8} };// 3行5列
// 1 2 0 0 0
// 3 4 0 0 0
// 5 6 7 8 0
double score[5][30] = { 0 };
return 0;
}
(二)二维数组的遍历与使用
// 二维数组的使用
int main()
{
int arr[3][5] = { 0 };
// 输入值
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
scanf("%d", &arr[i][j]); // 数组名是地址,数组的元素是元素
}
// 输出值
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
}
程序详解:
1、定义一个二维3行5列的二维数组,将其数组元素全部置为0
2、使用2个for循环遍历二维数组,接收数组的输入值
就像一个n的元素的一维数组一样,数组下标从0开始,到下表n-1结束,即元素个数-1。
所以数组arr
的索引范围在[0][0]
到[2][4]
之间(基于0的索引)。
(三)二维数组在内存中的存放
// 二维数组在内存中的存储
int main()
{
int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
}
/*
&arr[0][0] = 02EFF6F8
&arr[0][1] = 02EFF6FC
&arr[0][2] = 02EFF700
&arr[0][3] = 02EFF704
&arr[0][4] = 02EFF708
arr[0] [j] 所以二维数组第一个数组名是 arr[0]
// 每个元素之间差4个字节,跨行的也差4个字节
&arr[1][0] = 02EFF70C
&arr[1][1] = 02EFF710
&arr[1][2] = 02EFF714
&arr[1][3] = 02EFF718
&arr[1][4] = 02EFF71C
arr[1] [j] 所以二维数组第二个数组名是 arr[1]
&arr[2][0] = 02EFF720
&arr[2][1] = 02EFF724
&arr[2][2] = 02EFF728
&arr[2][3] = 02EFF72C
&arr[2][4] = 02EFF730
arr[2] [j] 所以二维数组第三个数组名是 arr[2]
可以看出二维数组和一维数组一样在内存中也是连续存放的
*/
// 将二维数组按照列打印
// arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
// 1,2,3,4,5
// 2,3,4,5,6
// 3,4,5,6,7
for (i = 0; i < 5; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
printf(" % d ", arr[j][i]);
printf("\n");
}
return 0;
}
从上面的程序可以看出,与一维数组一样,二维数组在内存中也是连续存放的
即从arr[3][5]中第一个一维数组arr[0]依次高地址递增。
标签:初始化,arr,一维,int,学习心得,C语言,二维,数组 From: https://blog.csdn.net/benjiangliu/article/details/141139814