相较于一维数组,二维数组可以理解为数组中的数组,而用指针引用二维则与二级指针有关。
难点是与一维数组有重合部分但赋予了新概念。
设a为二维数组名,从二维数组角度看,代表第零行零列元素a【0】【0】即&a【0】【0】也就是二维数首元素的地址,指向a【0】也称0行起始地址,此时的首元素并不代表一个整形元素,而是代表一个由4个整型元素所组成的一维数组,这里统一二维数组为a【3】【3】。
这里做下区分和定义。
a+1代表第一行零列起始地址,a+n(自然数)代表第几行,,a【n】+n代表列的增加(只有在出现行时,也就是出现a(数组名)【n】后面加数代表列的移动);
a+n指向a【n】,或者说a+n是a【n】的地址,当(a+n)时与a【n】等价(a+1=a【n】实际是将指针a向后移动了一行的元素乘以字节,如a的地址为2000,那么a+1是2000+3X4=2016,一行有三个元素,4为字节数);
**着重强调(a+0)存放的是a【0】所指向元素的地址,而a【0】本身就是所指向元素的地址a取出的是所指向元素的地址(a)才可取出元素的值**
若用一个指针变量pt来指向一维数组,应这样定义
int (pt)【4】;
表示pt指向由4个整型元素组成的一维数组。
接下来引入行列,a(二维数组名)指向行,为自身的地址,*a【1】指向列即所要取元素地址,当在加上&时指向列又指向了行。&a【0】与&a【i】等价。
`#include<stdio.h>
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf("%d,%d\n",a,(a+0));
printf("%d,%d\n",a[0],(a+0));
printf("%d,%d\n",&a[0],&a[0][0]);
printf("%d,%d\n",a[1],a+1);
printf("%d,%d\n",&a[1][0],(a+1)+0);
printf("%d,%d\n",a[2],(a+2));
printf("%d,%d\n",a[1][0],((a+1)+0));
printf("%d,%d\n",a[2],((a+2)+0));
return 0;
}`
效果图辅助理解