数组指针

来源:百度知道 编辑:UC知道 时间:2024/07/04 07:46:00
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int(*p)[4];
p=&a[0];
cout<<(*p)[0]<<" "<<*p[0]<<endl;
两个的值为何一样?含义有何区别?不懂,高手来,要说的容易理解啊

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int(*p)[4];
p=&a[0];
cout<<(*p)[0]<<" "<<*p[0]<<endl;
俩者都表示指向0行0列元素

用(*p)[1]和*p[1]来说可能更清楚
这俩者就有区别了
(*p)[1]表示0行1列元素,*p先指向0行0列地址,(*p)[1]相当于在对*p的地址加1,也就是指向下一列,所以最后指向0行1列
*p[1]表示1行0列元素,根据优先级不同,先计算p[1],这是指向1行0列的地址,*p[1],就表示1行0列元素

a[3][4]是个二维数组,3 行4列
int(*p)[4]; 是一个数组指针,它指向一个具有四个元素的一维数组;
p=&a[0]; 让p指向二维数组的第一行a[0]的首地址(也就是是a[0][0]的地址),
cout<<(*p)[0]<<" "<<*p[0]<<endl; 把 a[0][0]打印出来。~~
(*p)[0]可以吧 *p看成a[0](根据p=&a[0]),那么(*p)[0]==a[0][0];
*p[0]中p[0]是a[0][0]地址,*p[0] == a[0][0],原因和前一个一样~~

恩,是一样的,你定义的p是一个指向数组的指针,对于二维数组来说,后面的数值是用来定义p递增1之后增加的单位个数的,比如你这个程序,当p+1的时候,p移动的是4个整型的长度,这个与你定义的a[3][4]对应使得对应更加方便,当你执行了p=&a[0],p就指向数组a的第一个元素,但是p是一个行指针,就是说p递增1以后对a是移动了一行,但是*p[0]就是一个列指针了,你对p这个时候递增1,它移动的仅仅是一个元素,值是一样的,但是它们的下一步的动作不一样,下面是我写的一点东西,希望你看完能明白一点
对于二维数组,它的数组名是一个指向指针的指针,这也就是为什么你要取一个二维数组的值就必须要用两个*,或者是两个[],或者是一个