上学期学的二维数组指针全忘了,今天又整理了一些资料看看。
先回顾一下一维数组:
一维数组的数组名表示第一元素的地址,也就是这段连续空间的起始地址,数组首地址,因此数组名实质就是一个指针常量。
进入正题:二维数组
int a[3][4]={{1,3,5,5},{1,5,3,9},{5,9,8,6}};
先假设首地址为0000;
二维数组a可看作为包含a[0],a[1],a[2]这3个元素的数组,
所以a为这三个元素的地址,即a=&a[0],a+1=&a[1],a+2=&a[2];
此外,a[0],a[1],a[2]又可以看成3个长度为4的一维数组名,
a[0]表示包含a[0][0],a[0][1],a[0][2],a[0][3]这四个元素的一维数组的数组名,即a[0]=&a[0][0]; 同理a[1]=&a[1][0],a[2]=&a[2][0];
a[i]和&a[i]之间的关系:
例如:a[0]和&a[0]之间的关系,其实a[0]和&a[0]在值上相同指向同一个位置可以看成a[0]=&a[0]
但是意义不同:
a[0]等效于int*型,实际上指向一个元素,&a[0]是行指针,指向一行;
a[0]+1表示下一个元素的地址,在这里就是0004;
&a[0]+1表示下一的地址,在这里就是0016(int占4个字节,0000+4x4);
对于a[i][j];
a+i=&a[i], *(a+i)=a[i];
a[i]+j=&a[i][j]=*(a+i)+j ;
*( a[i]+j)= a[i][j]=*( *(a+i)+j )