何为指针数组
举例说明:
整型数组 --- 存放整型变量的数组
字符数组 --- 存放字符变量的数组
由以上的类型可以推断出……………………
指针数组 --- 存放指针变量(存放地址)的数组
代码演示:
#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 ]
代码验证: