请问各位大神,二维数组和三维数组的本质是神马?为啥要取多次*呢?那多维数组呢?对一维、二维、三维等数组名取地址取得是神马呢?请说得仔细点,本人小白,谢谢各位大神了
认证0级讲师
c中的多维数组应该是数组的数组,所以3维数组是元素为2维数组的数组,2维数组是元素为1维数组的数组.
int array[2][4][5]; int (*a)[4][5] = array; // 1) int (*b)[5] = array[i]; // 2) int (*c) = array[i][j]; // 3) int d = array[i][j][k]; // 4)
首先,要明确一点,1维数组的数组名就是1维数组的起始地址。
多维数组中取到的元素,除了最低维度,都可以认为是”数组名“,也就是数组的起始地址。比如A4中取A[2],那A[2]就是A4中第2(从0算起)个1维数组的起始地址。
然后我们从4)开始看,array[i][j][k]就是一个值,没什么问题吧。
array[i][j][k]
再来看3)array[i][j]表示的是在这个3维数组中,我选择第i个2维数组,然后在这个2维数组中再选择第j个1维数组,所以array[i][j]是这个1维数组的起始地址(可以理解为是1维数组的数组名),所以用int (*c)。
array[i][j]
int (*c)
跳过2)我们来看1),array是3维数组的数组名,所以也是3维数组的起始地址,因为它的元素是2维数组,所以我们用int (*a)[4][5]
array
int (*a)[4][5]
然后是很多*的问题:比如这个A[m][n]要访问(i,j)那就是用*(*(A + i) + j),为什么,A是2维数组数组名,所以是2维数组的起始地址,A + i是A的第i个元素的地址,取×得到其值,其值是一个1维数组,也就是这个1维数组的起始地址,(A + i) + j取得这个1维数组第j可元素的地址,然后再取得到这个值。
A[m][n]
(i,j)
*(*(A + i) + j)
A + i
本质都是数组啊,就像一维空间是一条直线,二维空间就是许多条直线,也就是说二维是由一维拓展得到的,三维以此类推。
c中的多维数组应该是数组的数组,所以3维数组是元素为2维数组的数组,2维数组是元素为1维数组的数组.
首先,要明确一点,1维数组的数组名就是1维数组的起始地址。
多维数组中取到的元素,除了最低维度,都可以认为是”数组名“,也就是数组的起始地址。比如A4中取A[2],那A[2]就是A4中第2(从0算起)个1维数组的起始地址。
然后我们从4)开始看,
array[i][j][k]
就是一个值,没什么问题吧。再来看3)
array[i][j]
表示的是在这个3维数组中,我选择第i个2维数组,然后在这个2维数组中再选择第j个1维数组,所以array[i][j]
是这个1维数组的起始地址(可以理解为是1维数组的数组名),所以用int (*c)
。跳过2)我们来看1),
array
是3维数组的数组名,所以也是3维数组的起始地址,因为它的元素是2维数组,所以我们用int (*a)[4][5]
然后是很多*的问题:
比如这个
A[m][n]
要访问(i,j)
那就是用
*(*(A + i) + j)
,为什么,A是2维数组数组名,所以是2维数组的起始地址,A + i
是A的第i个元素的地址,取×得到其值,其值是一个1维数组,也就是这个1维数组的起始地址,(A + i) + j取得这个1维数组第j可元素的地址,然后再取得到这个值。本质都是数组啊,就像一维空间是一条直线,二维空间就是许多条直线,也就是说二维是由一维拓展得到的,三维以此类推。