一维数组的单位是元素,一维数组名代表首个元素的地址
二维数组的单位是一维数组,二维数组名代表首个一维数组的地址
二维数组的单位是一维数组,二维数组名代表首个一维数组的地址
为了方便理解,定a一维数组 aa二维数组 aaa三维数组
对于整型一维数组a来说:
a : 数组名,表示指针常量,保存数组首元素的地址,是一个常量,不 可以进行自加操作。
&a 代表数组的地址
对一维数组名取地址等于一维数组的地址;
对数组的地址取值等于等于一维数组的首元素的地址
对一维数组名取地址等于一维数组的地址;
对数组的地址取值等于等于一维数组的首元素的地址
对于二维数组来说,定义时不能省略列,可以省略行。
aa + i :第i+1个一维数组的地址
*(aa+i):第i+1个一维数组的首元素的地址
*(aa+i)+j:第i+1个一维数组的第j+1个元素的地址
*(*(aa+i)+j):第i+1个一维数组的第j+1个元素的值
&aa:对二维数组名取地址等于二维数组的地址
*(&aa) = aa:对二维数组的地址取值等于首个一维数组的地址
**(&aa) == *aa:对二维数组的首个一维数组的地址取值等于二维数组 首个一维数组的首元素的地址
*(aa+i):第i+1个一维数组的首元素的地址
*(aa+i)+j:第i+1个一维数组的第j+1个元素的地址
*(*(aa+i)+j):第i+1个一维数组的第j+1个元素的值
&aa:对二维数组名取地址等于二维数组的地址
*(&aa) = aa:对二维数组的地址取值等于首个一维数组的地址
**(&aa) == *aa:对二维数组的首个一维数组的地址取值等于二维数组 首个一维数组的首元素的地址
对于三维数组来说:
&a:三维数组的地址
a:三维数组的数组名,也就是首个二维数组的地址
*a: 首个二维数组的首个一维数组的地址
**a:首个二维数组的首个一维数组的首元素的地址
***a:首个二维数组的首个一维数组的首元素的值
&a:三维数组的地址
a:三维数组的数组名,也就是首个二维数组的地址
*a: 首个二维数组的首个一维数组的地址
**a:首个二维数组的首个一维数组的首元素的地址
***a:首个二维数组的首个一维数组的首元素的值
*(*(*(a + i) + j) + k);
a + i:第i + 1个二维数组的地址
*(a + i):第i + 1个二维数组的首个一维数组的地址
*(a + i) + j:第i + 1个二维数组的第j + 1个一维数组的地址
*(*(a + i) + j):第i + 1个二维数组的第j + 1个一维数组的首元 素的地址
*(*(a + i) + j) + k:第i + 1个二维数组的第j + 1个一维数组的 第k + 1个元素的地址
*(*(*(a + i) + j) + k):第i + 1个二维数组的第j + 1个一维数 组的第k + 1个元素的值
a + i:第i + 1个二维数组的地址
*(a + i):第i + 1个二维数组的首个一维数组的地址
*(a + i) + j:第i + 1个二维数组的第j + 1个一维数组的地址
*(*(a + i) + j):第i + 1个二维数组的第j + 1个一维数组的首元 素的地址
*(*(a + i) + j) + k:第i + 1个二维数组的第j + 1个一维数组的 第k + 1个元素的地址
*(*(*(a + i) + j) + k):第i + 1个二维数组的第j + 1个一维数 组的第k + 1个元素的值
数组名当形参的时候,编译器将它当成指针看待的(强制类型转换),传一维数组名是用元素的指针来接,传二维数组名是用一维数组的指针来接,
a[3]
传一维数组名用元素的指针来接 int *a
a[2][2]
传二维数组名用一维数组指针来接 int (*a)[2]
a[3][2][2]
传三维数组名用二维数组指针来接 int (*a)[2][2]
传一维数组名用元素的指针来接 int *a
a[2][2]
传二维数组名用一维数组指针来接 int (*a)[2]
a[3][2][2]
传三维数组名用二维数组指针来接 int (*a)[2][2]
数组指针什么时候用? 函数传参的时候用。