内存地址深层理解之“一级指针遍历二维数组”

一级指针遍历二维数组

前言:本文中出现的有关小数组,进阶的陌生知识点,我将一一解释清楚。

源代码:

//一级指针 遍历 二维数组
	int c[2][3] = {{1, 2, 3}, {4, 5, 6}};
	int *d = c[0]; //输出小数组中的元素
	int *e;        //进阶小数组 换到另一个小数组中 继续输出
	for (int i = 0; i < 2; i++) {
		if (i == 1) {
			printf("\n");
		}
		if (i > 0) {
			e = &c[0] + i; //进阶小数组 换到另一个小数组中 继续输出
			d = e;
		}
		for (int j = 0; j < 3; j++) {
			printf("%d ", *(d + j)); //输出小数组中的元素
		}
	}


小数组:

在二维数组中存在小数组。

讲小数组前 我们先了解一下关于二维数组的概念,可能会改变你对二维数组的认知。

 

 

好,我认为现在你已经懂什么是小数组了,我们继续。

进阶:

进阶是指地址的增加或减少,所以我们就需要对地址有一个理解。

以图中的代码为例,c[0]的地址是小数组c[0]的第一个元素的地址,那该数组的第二个元素的地址该怎么访问,这时我们通过进阶地址,在c[0]的第一个元素的地址的基础上加一 ,c[0] + 1;

 

在显示屏上我们看到的是+ 1,但是读取的内存地址显示的是 + 4,为什么呢?因为c[0]是一个int型,int的字节数是4,内存是以字节为单位,所以内存地址加4。


通过定义一个指针d,获取第一个小数组c[0]的第一个元素的地址(首地址),这一步的目的是为了不断输出小数组c[0]中的所有元素做准备。

再通过定义一个指针e,目的是从第一个小数组进阶到第二个小数组,这样我们就可以读(输出)第二个小数组中的所有元素。

可能你有疑问了,我定义一个指针d,不就可以达到遍历效果了吗?

没有错,但是如果二维数组的维数变多,元素变多,我们需要进阶的数也就越来越多,从程序的完备性,便捷性角度考虑,我们不这么做。

第一次循环,输出了小数组c[0]的所有元素:1, 2, 3

第二次循环:

首先外层循环我们输出了换行符号,为了后续打印的美观,让数据看起来是二维数组。

通过定义好的指针e,我们得到了小数组的地址,这里要注意,我们在c[0]前加上了&取地址符号,这里我定义&c[0]为小满数组型地址,你可以先不用理解什么是小满数组型地址,这里取的地址是小数组c[0]的首地址,但它的进阶单位为一整个小数组,c[0] + 1 == c[1], 这就是我们为什么可以进阶到第二个小数组的原因。

输出c[1]中的所有元素:4, 5, 6

 有不懂的欢迎留言,也可以一起讨论。

内存地址深层理解之“一级指针遍历二维数组”

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值