N维数组: N维数组基本上是一个数组数组。由于将一维数组标识为单个索引,因此使用两个索引标识二维数组,类似地,使用N个索引标识N维数组。多维数组的声明如下:
int NDA[S1][S2][S3]……..[SN];
说明:
- 在此,NDA是N维数组的名称。它可以是任何有效的标识符名称。
- 在以上语法中, S 1 ,S 2 ,S 3 ……S N表示N个维度的最大大小。
- 对于所有尺寸,下限均假定为零。
- 上面的数组被声明为整数数组。它也可以是除整数以外的任何有效数据类型。
N维数组的地址计算:
假设:
- N维数组NDA的最大大小为N维,分别为S 1 ,S 2 ,S 3 ,……,S N。
- 的元件,其地址需要被具有分别计算指数L 1,L 2,L 3,………… ..lñ。
- 数组索引可能没有下限为零。例如,考虑以下数组T: T [-5…5] [2……9] [14…54] [-9…-2]。
说明:
- 在上面的数组T中,索引的下界不是零。
- 这样,数组的索引大小现在就不同了,可以使用以下公式计算:
UpperBound – LowerBound +1
- 因此,这里S 1 = 5 –(-5)+1 =11。类似地,S 2 = 8,S 3 = 41和S 4 = 8。
对于地址计算,下限为t 1 ,t 2 ,t 3 …….t N。存在两种存储数组元素的方法:
- 行专业
- 专栏专业
列主要公式:
Address of NDA[I1][I2]. . . [IN] = BAd + W*[((…ENSN-1+ EN-1 )SN-2 +… E3 )S2+ E2 )S1 +E1]
- BAd represents the base address of the array.
- W represents the width of the array i.e, the number of dimensions in the array.
- Also, Ei is given by Ei = li – ti, where li and ti are the calculated indexes (indices of array element which needs to be determined) and lower bounds respectively.
行专业公式:
Address of NDA[I1][I2]. . . .[lN] = BAd + W*[((E1S2 + E2 )S3 +E3 )S4 ….. + EN-1 )SN + EN]
学习公式的最简单方法是:
对于主要行:如果width = 5,则内部序列为E 1 S 2 + E 2 S 3 + E 3 S 4 + E 4 S 5 + E 5 ;如果width = 3,则内部序列为E 1 S 2 + E 2 S 3 + E 3 。找出顺序中的图案,并针对任何宽度的公式遵循四个基本步骤:
- 写下内部顺序。
- 除第一个项外,在每个E后面加上右括号。因此,对于宽度= 5,它变为
E1S2 + E2)S3 + E3)S4 + E4)S5 + E5).
- 首先放置所有的开口支架。
((((E1S2 + E2)S3 + E3)S4 + E4)S5 + E5).
- 在公式中包含基地址和宽度。
对于Column Major而言,该方法类似,但是内部序列的模式与row-major模式相反。
对于主要列:如果width = 5,则内部序列为E 5 S 4 + E 4 S 3 + E 3 S 2 + E 2 S 1 + E 1 。
示例:让我们采用基地址为1200的多维数组A [10] [20] [30] [40] 。任务是找到元素A [1] [3] [5] [6]的地址。
在此,BAd = 1200,宽度= 4。
S1 = 10,S2 = 20,S3 = 30,S4 = 40
由于未给出下限,因此下限假定为零。
E1 = 1 – 0 = 1;
E2 = 3 – 0 = 3;
E3 = 5 – 0 = 5;
E4 = 6 – 0 = 6。
可以使用任何一种技术(行优先或列优先)来计算答案(除非指定)。
通过将公式应用于主要行,可直接将公式写为:
A [1] [3] [5] [6] = 1200 + 4((((1×20 + 3)30 +5)40 + 6)
= 1200 +4((23×30 +5)40 +6)
= 1200 + 4(695×40 + 6)
= 1200 +(4×27806)
= 112424。