一维数组
数组指针的赋值:
数组指针指向数组,所以不能用int (*p1)[3]=a,因为数组指针本质上是个二级指针,a只是一级指针。
int a[3]={1,2,3};
int (*p)[3]=&a;//这样才行
数组指针的输出:
printf("%d",*(*p+1));//输出2
因此:
① *(*p+i) == a[ i ];
② *p+i 是指向a[ i ]的一级指针,即a[ i ]的地址;
③ *(p+1)是跳过整个a[ n ]数组的一个地址;
这个可以理解成 p 的值是一个二维数组a[ m ][[ n ]的地址,那么 * p是a[ m ][ n ]的第0行的地址,因此 *(p+1)是第1行的地址,而把一维数组看成二维数组的第0行,这样就可以理解为什么会跳过整个一维数组了。(如果还是不懂可以看下面二维数组)
二维数组
数组指针的赋值:
int a[2][3]= {{1,2,3},{4,5,6}};
int (*p)[3]=a;//因为a本身就是一个二维数组,因此不用取地址
数组指针的输出:
printf("%d\n",*(p));//这是第 0 行的地址
printf("%d\n",*(p+1));//这是第 1 行的地址
printf("%d\n",*(*(p+1)+2));//正确输出 6
因此:
① * ( *(p+i)+j) == a[ i ][ j ];
② *(p+i)是第 i 行的首地址 ;
③ p是a的地址,p+1是跳过整个二维数组的地址;
④虽然和a[ 0 ][ 0 ]的地址和第0行的地址数值相同,但是意思不同。