指针数组则是一个其中每个元素均为指针的数组;
数组指针则是一个指向数组的指针。
下面我们通过一个简单的例子来理解一下。
定义一个4*4的二维数组a[4][4]
#include<iostream>
using namespace std;
int main()
{
int a[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
// []的优先级要大于*,故相当于*(p1[4])
// p1为指针数组,它有四个元素,每个元素是一个int *类型的指针,
// 这些指针存放着其对应的首地址。 p1 的大小为16
int *p1[4] = {a[0],a[1],a[2],a[3]};
// p2是一个指向 int[4] 数组的指针 这里每个元素都是一个数组 数组指针
// int (*p2)[4] = a[0] 是不对的 因为a[0]是数组首元素首地址 p2存放的是数组首地址
// a[0]+1 将会加1 (p2+1) 将会加4
// p2的大小为4
int (*p2)[4] = a;
//同p1 是一个 指针数组 大小为16
int *(p3[4]) = {a[0],a[1],a[2],a[3]};
// p4是一个指向数组的指针 注意与p2的区别
int *p4 = a[0];
cout << sizeof(p1) <<endl;
cout << sizeof(p2) <<endl;
cout << sizeof(p3) <<endl;
cout << sizeof(p4) <<endl <<endl;
cout << *(p1[3]+1) <<endl;
cout << *(*(p2+3)+1) <<endl;
cout << *(*(p3+3)+1) <<endl;
cout << *(p4+13) <<endl;
cout << **(p2+1) <<endl;
cout << *(a[0]+1) <<endl;
system("pause");
return 0;
}
运行结果:
cout << p2 << endl;
cout << a << endl;
cout << *p2<< endl;
cout << p2+1<< endl;
cout << *p2+1<< endl;
cout << a[1]<< endl;
运行结果:
可以看出来p2相当于a,p2指向二维数组的第一行的首地址,*p2指向第一行第一列,二者相同,但p2+1将会指向第二行的首地址,*p2+1将会指向第一行第二列。