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

一级指针遍历二维数组

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

源代码:

//一级指针 遍历 二维数组
	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
    评论
### 回答1: 可以通过定义两个指针,一个指向行,一个指向列,然后使用循环进行遍历,比如:for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ //do something } } ### 回答2: 要利用数组指针遍历二维数组,首先需要理解数组指针的概念。数组指针是一个特殊的指针类型,它指向数组的第一个元素。 对于一个二维数组,其实质上是一个由多个一维数组组成的数组。我们可以定义一个数组指针来指向这个二维数组,然后通过移动指针的方式来访问数组的每个元素,实现遍历的目的。 假设有一个二维数组arr,它有m行n列。我们可以定义一个指针ptr,让它指向数组的第一个元素,即arr[0][0]。然后我们可以使用两个嵌套的循环来遍历整个数组。 外层循环控制行的变化,从0到m-1;内层循环控制列的变化,从0到n-1。在每次循环中,通过指针ptr来访问当前元素,然后将指针向后移动一位,以访问下一个元素。 以下是一个示例代码,演示如何利用数组指针遍历二维数组: ```c #include <stdio.h> int main() { int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int *ptr = &arr[0][0]; // 定义指针ptr指向数组第一个元素 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", *ptr); // 输出当前元素的值 ptr++; // 指针后移一位 } printf("\n"); } return 0; } ``` 以上代码中,我们定义了一个3行4列的二维数组arr,并让指针ptr指向数组的第一个元素arr[0][0]。然后通过两个循环,遍历整个数组并输出每个元素的值。 通过这种方式,我们就可以利用数组指针遍历二维数组,完成相关的操作。 ### 回答3: 利用数组指针遍历二维数组的方法如下:首先定义一个指向二维数组指针变量,然后通过循环遍历每个元素。 假设二维数组为arr[m][n],定义指针变量p指向arr,即p = arr,然后通过两层for循环遍历每个元素,外层循环控制行数,内层循环控制列数。 遍历过程中,通过指针变量p和双层循环的i和j来访问每个元素,具体操作为*(p + i * n + j),其中p表示指针变量,i表示当前行数,n表示列数,j表示当前列数。这样就可以依次访问和处理二维数组中的每个元素。 下面是以遍历并输出二维数组为例的代码示例: ```c #include<stdio.h> #define MAX_ROW 3 // 定义二维数组的行数为3 #define MAX_COL 4 // 定义二维数组的列数为4 int main() { int arr[MAX_ROW][MAX_COL] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; // 初始化一个3行4列的二维数组 int (*p)[MAX_COL] = arr; // 定义一个指向二维数组指针,并将其指向arr for (int i = 0; i < MAX_ROW; i++) { for (int j = 0; j < MAX_COL; j++) { printf("%d ", *(p + i * MAX_COL + j)); // 输出当前元素的值 } printf("\n"); // 换行 } return 0; } ``` 运行以上代码,输出结果为: 1 2 3 4 5 6 7 8 9 10 11 12 利用数组指针遍历二维数组可以方便地对每个元素进行操作和处理,是处理二维数据的一种常用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值