一、指向一维数组的数组指针
数组指针是指向一个数组的指针。如
int (*p)[10];
p是一个指针,指向一个包含10个元素的一维数组,数组元素是整形。
如果写成了int *p[10],则是一个指针数组,由于[ ]的优先级比*的高,p先与[ ]结合,p就是数组类型的数据,元素是指针。
下面是数组指针与一维数组名取地址的实验:
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int (*p)[10];
p=&a;
cout<<a<<endl;
cout<<&a<<endl;
cout<<p<<endl;
system("pause");
}
地址值是一样的,但是意义却不一样。
1)a是数组名,也是数组的首地址,相当于&a[0],类型是int*,即指向int的指针。是一个一维指针,每增加1移动一个int单位。如int *p=a; p++;p指向的是元素a[1];实验代码如下:
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
//int (*p)[10];
int *p=a;
p++;
cout<<*(p)<<endl;
cout<<a<<endl;
cout<<&a<<endl;
cout<<p<<endl;
system("pause");
}
结果:
2)&a的类型是int*[10],类型是指向一个含有10个int元素的数组的一个指针。是一个二级指针,每增加1移动1个Int[10]单位。如*(&a+1)表示整个数组后的一个单位,即0后面的一个单位。*(*(&a+1)-1)就表示a[9]=0;实验代码和结果如下:
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int (*p)[10];
p=&a;
cout<<*(*(&a+1)-1)<<endl;
cout<<*(*(p+1)-2)<<endl;
system("pause");
}
结果:
3)p是数组指针,指向一个含有10个int元素的数组的一个指针a。与&a一致。
二、指向多维数组的数组指针。
指针与指向的数组的维数没有关系,关键在于数组指针是一个二级指针,指向一个一维数组单位。数组指针移动一个单位,相当于移动了一整个一维数组。
为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。
例如:
int a[3][3];
int (*p)[3]=a;
这里a是个二维数组的数组名,相当于一个二级指针常量;p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以一维数组长度为单位;p+i是二维数组a的i行的起始地址,*(p+2)+2表示a数组2行2列元素地址(第一行为0行,第一列为0列),*(*(p+2)+2)表示a[2][2]的值。
实验代码如下:
#include<iostream>
using namespace std;
int main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int (*p)[3];//指针与指向的数组的维数没有关系,关键在于数组指针是一个二级指针,指向一个一维数组单位。数组指针移动一个单位,相当于移动了一整个一维数组。
p=a;//指向一维的是 p=&a;
cout<<*(*(a+1)-1)<<endl;//对比一维
cout<<*(*(p+1)-2)<<endl;//对比一维
cout<<"*(*(a+2)+2): "<<*(*(a+2)+2)<<endl;
cout<<"a[2][2]: "<<a[2][2]<<endl;
cout<<"p[2][2]: "<<p[2][2]<<endl;
cout<<"*(p[2]+2): "<<*(p[2]+2)<<endl;
system("pause");
}
结果: