概念

指针数组

在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维数组指针的定义:int (*p)[4]
定义了一个指针p,指向一个4个元素的数组。只是定义一个指针,
指向4个元素的数组

数组指针

数组指针,指的是数组名的指针,即数组首元素地址的指针。
即是指向数组的指针。一般定义形式为:"类型名 (*数组标识符)[数组长度]"
又例如,一个一维指针数组的定义:int *p[4]
定义了一个数组指针p[4],p的每个元素指向一个整型的数据。就
是数组里面保存的是指针

记忆方法

很简单,你看这数组,它又宽又长...跑题了跑题了
其实你这么看
指针数组 "指针"二字在前,即表示它所有元素为指针类型
数组指针 "数组"二字在前,即表示它所有元素为数组类型

实际应用

1、 int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型。
可以这样来用:

#include <stdio.h>
int main() {
int* p[2];
int a[3] = {1, 2, 3};
int b[4] = {4, 5, 6, 7};
p[0] = a;
p[1] = b;
for(int i = 0; i < 3; i++) 
    printf("%d ", *(p[0] + i));  // printf("%d ", **p + i);
printf("\n");
for(int i = 0; i < 4; i++) 
    printf("%d ", *(p[1] + i));  // printf("%d ", **p + i);
}

结果为:

1 2 3
4 5 6 7

2、 对于int (*p)[2], 它相当于一个二维数组的用法,只是它是一个n行2列的数组,可以这样来用:

#include <stdio.h>
int main() {
int (*p)[2];
int b[3][2] = {{1, 2}, {3, 4}, {5, 6}};
p = b;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2; j++) 
printf("%d ",*(*(p+i)+j)); //printf("%d ",b[i][j]);
}
printf("\n");
}

结果为:

1 2 3 4 5 6