文件名称:多维数组的地址表示-复高斯分布的数学基础理论
文件大小:6.48MB
文件格式:PDF
更新时间:2024-06-28 07:07:14
嵌入式 Linux C
图 6.14 多维数组的内存分布 因此,在此时,a[i]所代表的单位为一行(图中的 b1[3]、b2[3]、b3[4]、b4[3]),而不再 是原先的一个数据。在多维数组中,数组名 a 依然代表整个数组的首地址,而这时,a+1(a[1]) 代表第二行的首地址(b2[3]的首地址),同理,a+2(a[2])代表的是第二行的首地址。要记 住的是,这时的 a[0]代表的是第一行,a[1]代表的是第二行,依此类推。 注意 确定指针偏移量“1”所代表的单位是通过“1”之前的元素单位来定的,在二维数组中,当偏 移量前的元素单位为整个数组时,偏移值单位为行;当偏移量前的元素单位为行时,偏移值单 位为行中的元素。 那么,这时如何来表示第 0 行的第一列元素的地址呢? 这时可以用 a[0]+1 来表示,注意此时的 1 代表的是每列元素的字节数而不是每行元素的 字节数。因此,a[0]+0、a[0]+1、a[0]+2 分别表示的是 a[0][0]、a[0][1]、a[0][2]的地址(即&a[0][0]、 &a[0][1]、&a[0][2]),如图 6.15 所示。 a a+1 a+2 a+3 0xb8f00000 0xb8f00600 0xb8f00c00 0xb8f02000 b1[3] b2[3] b3[3] b4[3] a[0] a[0]+1 a[0]+2 图 6.15 多维数组的地址表示 在本书指针的下标引用中已经提到过,a[0]和*(a+0)是等价的,a[1]和*(a+1)是等价 的,因此,a[0]+1 和*(a+0)+1 的值也是等价的,它们都是&a[0][1]。同样,a[1]+2 和*(a+1) +2 也是等价的,它们都是&a[1][2]。 现在再来分析 a[0]和*(a+0)。当它们表示多维数组时,原先 a[0]中的 a 在此时已经扩充 为 a[4],也就是图中的一列,因此,可以再把 a 展开为*(a+i)就得到了另一对等价式:a[0][0] 和*(*(a+0)+0)是等价的,a[1][2]和*(*(a+1)+2)是等价的。这样,多维数组中元素的 指针表示方法也已经给出了。 这里,需要对 a[i]的性质作进一步的说明。当 a 是一维数组名时,a[i]代表 a 中的第 i 个 元素;当 a 是二维数组名时,a[i]代表第 i 行的地址,此时 a[i]本身并不占实际的存储单元, 它也不存放 a 数组中各个元素的值,所以,a、a+i、*(a+i)、*(a+i)+j、a[i]+j 都是地址。