首先,要有一个意识,就是n维数组在内存空间的地址是连续的。
从a[0][0]开始,一直到a[0][n-1],然后紧接着是a[1][0]到a[1][n-1],即“每一行”的数据是紧跟在上一“行”数据的后面存放的。所以无论是n维数组,本质上都是一维的。
那编译器是如何从一维数组中,找到你用二维数组来表示的位置的元素呢?
因为你写的a[i][j],告诉了编译器这个数组是i×j的,所以编译器就能知道这个二维数组每行有几个元素,每列有几个元素,推算出a[i][j]的位置是i*(n-1)+j。
案例:
#include<stdio.h>
void d1(int a[2][9]){
printf("%d\n",a[1][0]);
}
void d2(int a[3][6]){
printf("%d\n",a[1][0]);
}
int main(){
int a[18];
for(int i = 0; i<18; i++) a[i] = i+1;
d1(a);
d2(a);
return 0;
}
运行结果: