1.数组名就是地址
2.多维数组的定义从左向右看,例如int a[5][3]实际上定义了一个int a[5],但是这个数组中每个元素都代表一个int [3]一维数组的首地址
3.多维数组实际上也是顺序存储的,因此只要知道首个元素的地址以及维度规格就可以直接通过计算的地址的方式来操作对应位置的数据
4.数组指针与指针数组:int (*p)[5]实际上和int a[][5]一样都是int [5]这一类一维数组的首地址/数组名/数组指针
int *p[5]是一个指针数组,可用于存储5个int类型的指针
5.综合案例:将一个二维数组传入函数的方法
直接传数组名
void fun(int a[][5]) ---->fun(A);
void fun(int (*p)[5]) ---->fun(A);
直接传第一个元素的地址
void fun(int *a) ---->fun(&A[0][0])或者fun(*A)
对于fun(*A)的理解:
A是数组名,是用于存储下一级一维数组的首地址的数组的第一个元素所在的地址(int a[5]),利用*运算符获取这个地址存储的元素的值,这个值为下一级一维数组的首元素的地址,因此传入函数的即为二维数组第一个元素的地址
如何利用第一个元素的地址操作二维数组(每行n个元素)
a[i][j] 利用下标运算符直接将地址转化为值
*(a+i*n+j) 利用顺序存储特性,进行地址运算,并最后用*获得地址对应的值
a[i*n+j] 利用顺序存储特性,利用下标运算符获得地址对应的值
*(*(a+i)+j) 利用多维数组的定义,先操作上级数组获得i行的首地址,再对i行这一个一维数组进行操作