指针数组模拟二维数组

目录

  1. 指针数组是什么?
  2. 为啥有指针数组?即它的用途是什么?
  3. 它能干什么?即它的模拟使用

正文

1.指针数组是一种存放指针的数组,即在该数组内的元素全是类型相同的指针。
2.之所以有指针数组是因为,我们想将指针存入一个容器,进而更好的访问,这个容器就是数组;它的用途就是存放指针。
3.下面就是本次博客的重点了:它的用途;我们可以利用它来模拟二维数组。基本思路如下:
首先,我们要知道什么是二维数组:二维即平面,虽然在实际的内存布局中它们是连续排列的并非符合行和列的不连续放置,但效果上,我们仍可以将它看成只拥有行和列的平面;我们都知道在二维数组的每一行都有一个首元素,只要我们知道了每一行的首元素的地址,重复+1我们就能将每一行的元素访问完,所以我们的基本想法就形成了,我们能不能先将每一行的首元素的地址先存起来呢,答案是:可以,指针数组就是实现这个的。好了,废话不多说,上代码:
先来一个代码的基本框架

#include<stdio.h>
int main()
{

	return 0;
}

接下来是创建数组,因为既然我们想模拟二维数组,肯定少不了利用一维数组了(一维数组可以看成二维数组的一个元素)

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	return 0;
}

下面我们可以创建一个指针数组来存放一维数组的首元素了,这是我们模拟实现二维数组的关键一步
但这里我们要注意:数组首元素的地址可以用数组名来表示,也可以用直接用下标来表示

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* arr[] = { arr1,arr2,arr3 };//或者是int* arr[] = { arr1[0],arr2[0],arr3[0] };
	return 0;
}

下面我们将用第一个循环来实现数组指针元素的访问

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* arr[] = { arr1,arr2,arr3 };//或者是int* arr[] = { arr1[0],arr2[0],arr3[0] };
	int i = 0;
	for (i = 0; i < 3; i++)
	{

	}
	return 0;
}

这里的 i 取值是0~2,正好是元素下标的值,可以利用它来访问 arr 数组里的元素,即上面数组的首元素;而接下来我们将利用我们访问的首元素来都整个数组进行访问,即再使用一个循环进行嵌套

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* arr[] = { arr1,arr2,arr3 };//或者是int* arr[] = { arr1[0],arr2[0],arr3[0] };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);//或者写成*(arr[i]+j)这两者是等价的
		}
		printf("\n");
	}
	return 0;
}

上面的注意事项:
当打印完一行后记得换行;
还有就是 arr [ i ] [ j ] == (arr [ i ] + j),这里的 arr [ i ] 访问的是 arr1~arr3 数组的首元素也是它们的数组名(即:arr[0]==arr1;arr [1]==arr2;arr[2]==arr3),进而 arr [ i ] 可以当成一个数组名来访问元素,这是我们只用在它后面加上 [ j ] 就行了。而对于(arr [ i ] + j) 我想就比较容易理解多了,就是首元素地址不断加1来访问整个数组的元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值