指针数组
元素全是指针的数组,申明方式: int* p[5] 。 这里的p是个数组,只不过存储的元素为指针,声明方式相当于(int*) p[5], 这里的int* 和 char, int, float 一样是一种类型——整型指针。
int a[5] = { 1,2,3,4,5 };
int* k[5];
k[0] = a; k[1] = &a[0] ; k[0]=a[1];
数组指针
数组指针是一个指向数组的指针,申明方式比如:int (*p)[5]。其实我认为这里应该称作p为一个有维度的指针,这里的维度是5,即 p+1 是p加上5个int型地址的长度,用公式表示可能更明白点,这里的1 = 5*sizeof(in*)。其实二维数组名也可以看作一个有维度的指针,int a[1][5] 和 int b[2][5]里的
a、
b都是一个维度为5的指针。同样,假设有一维数组 int k[5],对数组名k取地址得到的也是一个有维度的指针,
&k的类型即是一个维度为5的指针,有 p = &k
这种有维度的指针的类型是:type(*)[dimen] 。 比如 int(*p)[5]中p的类型就是int(*)[5]; char s[3][4]里s的类型可看作是char(*)[4] 。这里其实有一点歧义,实际上
数组名的类型跟对应的指针类型其实并不是一个类型。
数组名包含的含义要多得多,比如int a[4][5], 对a取址得到的指针类型是int(*)[4][5],即一个指向二维数组int [4][5]的指针;而int(*p)[5]中对p取值得到的指针类型是int(**)[5]。另外,sizeof得到的结果也完全不一样。
int b[5] ---------> sizeof(b) = 5*sizeof(int) = 5*4 = 20
int a[4][5] ---------> sizeof(a) = 4*5*sizeof(int) = 20*4 = 80
int (*p)[5] ---------> sizeof(p) = 4 (就是指针类型的大小)
int **m ---------> sizeof(m) = 4 (同上)
int a[5] = { 0,1,2,3,4 };
int sequen[5][5] =
{
{ 00, 01, 02, 03, 04 },
{ 10, 11, 12, 13, 14 },
{ 20, 21, 22, 23, 24 },
{ 30, 31, 32, 33, 34 },
{ 40, 41, 42, 43, 44 },
};
int(*pp)[5];
pp = &a;
cout << "(*pp)[3] = " << (*pp)[3] << endl; //result: 4
cout << "pp[3] = " << pp[3] << endl; //result: 003DF8B4 (地址)
cout << "pp[0][2] = " << pp[0][2] << endl; //result: 2
int(*p)[5] = sequen;
cout << "(*p)[3] = " << (*p)[3] ; //result: 3
cout << "p[3][3] = " << p[3][3] ; //result: 33
cout << "(*(p+2))[3] = " << (*(p + 2))[3] ; //result: 23
int(*ppp)[5];
ppp = sequen;
int(**g)[5] = &ppp;
cout << "(*g)[1][3] = " << (*g)[1][3]<<endl; //result: 13