C语言学习心得-二维数组

(一)二维数组的定义和初始化

定义二维数组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]依次高地址递增。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值