C语言 ——— 指针数组 & 指针数组模拟二维整型数组

何为指针数组

举例说明:

整型数组 --- 存放整型变量的数组

字符数组 --- 存放字符变量的数组

由以上的类型可以推断出……………………

指针数组 --- 存放指针变量(存放地址)的数组

代码演示:

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello world";
	char arr3[] = "LiHua";

	char* parr[] = { arr1,arr2,arr3 };

	return 0;
}

 此时的parr就是指针数组,管理3个一维数组

若要存放parr就要使用二级指针,二级指针的知识请见:一级指针 & 二级指针-CSDN博客

此时就可以使用parr指针数组来操作三个一维数组

如何通过parr来打印3个一维数组的内容:

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "hello world";
	char arr3[] = "LiHua";

	char* parr[] = { arr1,arr2,arr3 };

	int sz = sizeof(parr) / sizeof(parr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%s\n", *(parr + i));
	}

	return 0;
}

代码解析:

解析:int sz = sizeof(parr) / sizeof(parr[0]);

整个数组的总大小除以数组一个元素的大小就等于数组元素个数

解析:printf("%s\n", *(parr + i));

*parr:parr解引用,就能拿到parr这个指针数组的首元素,也就是arr1

*(parr+i):通过sz控制变量i 遍历parr指针数组的每个元素

printf("%s\n", *(parr + i)):每个元素解引用后就是各个一维数组的数组名,再通过%s的形式打印每个元素的内容

内存示意图:


 指针数组模拟二维整型数组

#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* parr[] = { arr1,arr2,arr3 };

	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int psz = sizeof(parr) / sizeof(parr[0]);

	for (int i = 0; i < psz; i++)
	{
		for (int j = 0; j < sz; j++)
		{
			printf("%d ", *(*(parr + i) + j));
		}
		printf("\n");
	}

	return 0;
}

代码解析:

解析:int sz = sizeof(arr1) / sizeof(arr1[0]); 

解析:int psz = sizeof(parr) / sizeof(parr[0]);

数组总大小 / 数组元素个数大小 = 数组个数

解析:printf("%d ", *(*(parr + i) + j));

*(parr + i):parr为指针数组,i 被 psz 限制,通过 parr + i 就能遍历指针数组中的每个元素的地址,再解引用就能访问到每个元素,所以 *(parr + i) 就等价于 遍历数组名{arr1,arr2,arr3}

*(*(parr + i) + j):由以上结论,原表达式可等价为:*(arr1 + j),*(arr2 + j),*(arr3 + j), 且 j被sz限制,通过 (arr1 + j)、(arr1 + j)、(arr1 + j) 就能访问各个数组的每个元素的地址,再解引用就能访问到每个元素,并以%d的形式打印

代码验证:

小结: 

真实二维数组在内存中的存储是连续的

parr指针数组模拟的二维数组不一定连续,可能是三块独立的空间各自存储,只是通过parr指针数组将他们关联在一起 

*(parr+0) 和 parr[0]

是等价的,*(parr+0) 就等价于 parr[0] ,系统在执行代码时,会将 parr[0] 替换为 *(parr+0)

所以上面的 *(*(parr + i) + j) 可替换为 parr[ i ][ j ]

代码验证:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值