第81节 二维数组的存储及地址表示

一、二维数组的存储

1.例如:float a[3][5] 在内存中申请一段连续的内存,按行连续存储数据:

a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[1][0],a[1][1],a[1][2],a[1][3],a[1][4],a[2][0],a[2][1],a[2][2],a[2][3],a[2][4]

2.输出二维数组元素的两种方法:

#include <stdio.h>
int main()
{
	int a[3][4] = { {1,2,3,4},{11,12,13,14},{21,22,23,24} };
	
	//输出a[2][1]地址:
	printf("%p\n", &a[2][1]); //直接取元素的地址
	printf("%p\n", &a[0][0] + 2 * 4 + 1); //通过首元素地址偏移得到;
	printf("%p\n", a + 2 * 4 + 1); //错误,二维数组名运算,按行进行加减
}
运行结果:
0095FDC4
0095FDC4
0095FE30

二、深入理解二维数组

1、二维数组看作是元素是一维数组的一维数组

2、例:int a[3][4];

 可以将 a 看作是一维数组,它有3个元素:a[0],a[1]和a[2]

 每个元素a[i]又是一个包含4个元素的一维数组

 a[i]是一维数组的名字,其值是第i行的起始地址

三、体会下面程序

#include <stdio.h>
int main()
{
	int a[3][4] =
	{
		{1,2,3,4},
		{11,12,13,14},
		{21,22,23,24},
	}; //这个二维数组可看作是包含三个“数组”元素的一维数组{a[0],a[1],a[2]}

	//以下四种输出都是元素a[2][3]的地址
	printf("%p\n", &a[2][3]); //直接取元素的地址
	printf("%p\n", a[2] + 3); 
	//a[2]为二维数组中的一个元素,这个元素是数组,a[2]是这个数组名代表首元素a[2][0]地址;
	printf("%p\n", *(a + 2) + 3); 
	//a是二维数组名代表&a[0],a+2是按行运算为&a[2],*(a+2)=&(&a[2])=a[2],后续同上;
	//=>*((&a[0]+2)+3) =>*(&a[2])+3 =>a[2]+3 =>&a[2][3];
	printf("%p\n", &a[0][0] + 2 * 4 + 3); //按首元素地址偏移理解,程序中不用乘占用字节数
	
    //以下四种输出都是元素a[2][3]的值
	printf("%d\n", *(&a[2][3]));
	printf("%d\n", *(a[2] + 3));
	printf("%d\n", *(*(a + 2) + 3));
	printf("%d\n", *(&a[0][0] + 2 * 4 + 3)); 
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值