1. 指针数组
1.1 概念
指针数组本质上是一个数组,是存放指针的数组。
1.2 指针数组表示
以整型指针数组和字符指针数组为例
int *arr1[3];//数组arr1有5个元素,每个元素的数据类型是整型指针数组
char *arr2[5];//数组arr2有5个元素,每个元素的数据类型是整型指针数组
1.3 举例
利用指针数组将多个一维数组模拟为一个二维数组:
假设有三个整型数组
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
将arr1、arr2、arr3的首元素地址存放在数组parr中,该数组就是整型指针数组
int* parr[3] = { arr1,arr2,arr3 };

图1 指针数组图例
但是需要注意的是:arr1、arr2、arr3这三个数组在内存中不一定会连续存放。
访问数组元素并打印
for (i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
//printf("%d ", *(parr[i] + j));
printf("%d ", parr[i][j]);
}
printf("\n");
}
2. 数组指针
2.1 概念
顾名思义,数组指针本质上是指针,是指向数组的指针
2.2 数组名
数组名通常表示的都是数组首元素的地址,但是有2个例外:
(1) sizeof (数组名) , 这里的数组名表示整个数组,计算的是整个数组的大小;
(2)&数组名,这里的数组名表示的依然是整个数组,所以&数组名取出的是整个数组的地址。
假设有一个10个整型元素的数组arr:

图2 &arr 和 &arr + 1图例
2.3 数组指针表示
以图2的数组为例,&arr是一个地址,那么应该存到哪里?
这里引入数组指针,可将这个数组地址存放在指针p中,p就是数组指针
int (*p)[10];//指针变量p,指向的是一个包含10个整型元素的数组
p先和*结合,说明p是一个指针变量,指向的一个包含10个整型元素的数组,需要注意的是,[]的优先级高于,所以加上()保证p先和*结合。
这里可以说明一下p的类型是int (*)[10],表示数组指针类型。
2.4 举例
用数组指针表示二维数组

图3 二维数组图例
void print(int(*p)[5], int r, int c)//这里用一个数组指针接收
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
printf("%d ", *(*(p + i) + j));
//*(p+i)表示第i行的数组名,相当于arr[i],即第i行首元素地址
//*(p + i) + j表示第i行首元素地址加j操作,即第i行第j个元素的地址
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//数组名表示首元素地址,二维数组的数组名表示第一行数组的地址
print(arr, 3, 5);//arr表示第一行数组地址,也就是一个一维数组的地址
}
2859

被折叠的 条评论
为什么被折叠?



