基础备忘:数组指针与对1维数组名取地址
基础备忘:数组指针与对一维数组名取地址
p是一个指针,指向一个包含10个元素的一维数组,数组元素是整形。
结果:
结果:![基础备忘:数组指针与对1维数组名取地址 基础备忘:数组指针与对1维数组名取地址](/default/index/img?u=aHR0cDovL3d3dy5teWV4Y2VwdGlvbnMubmV0L2ltZy8yMDEyLzA4LzE5LzIxNDYyNTM3MS5qcGc=)
结果:![基础备忘:数组指针与对1维数组名取地址 基础备忘:数组指针与对1维数组名取地址](/default/index/img?u=aHR0cDovL3d3dy5teWV4Y2VwdGlvbnMubmV0L2ltZy8yMDEyLzA4LzE5LzIxNDYyNTM3Mi5qcGc=)
一、指向一维数组的数组指针
数组指针是指向一个数组的指针。如
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"); }
结果: