84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
请问各位大神,二维数组和三维数组的本质是神马?为啥要取多次*呢?那多维数组呢?对一维、二维、三维等数组名取地址取得是神马呢?请说得仔细点,本人小白,谢谢各位大神了
认证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可元素的地址,然后再取得到这个值。本质都是数组啊,就像一维空间是一条直线,二维空间就是许多条直线,也就是说二维是由一维拓展得到的,三维以此类推。