也是引用嚴蔚敏老師的書
陣列的結構體定義如下
typedef struct { ElemType *base; int dim; //陣列的維度 int *bounds; //陣列的維界基址,就是陣列的維度 //比如int a[3][4][5]; //bounds[0] = 3;bounds[1] = 4; bounds[2] = 5; int *constands; //陣列映像函式常量基址}
在定位一個數組元素的時候,比如要求a[2][2][4]元素的值,按照我們的常理,可以直接用
a[2][2][4] = x;來賦值或者取值,但是這裡定義的陣列維度是可以改變的,比如說8維,而且陣列的空間都是用malloc函式分配得到的,基址為結構體裡面的指標。這時就不能再用上面的方法求值或者複製。需要得到我們要賦值或者取值的元的地址,透過地址操作來進行值的獲取。
因為是a[3][4][5],所以a[2][2][4]的地址就是base+2*4*5+2*5+4*1;為了簡便,在結構體中設定了constands,它的初始化是
Array.constands = (int *)malloc(dim * sizeof(int));
正好是陣列維度大小的int型,而且A.constands[dim - 1] = 1;其他的是
A.constands[i] = A.bounds[i + 1] * A.constands[i + 1];
每個A.constands[i]代表比dim - i低一維的所有元素的個數,比如上面的a[3][4][5]對應的就是A.constands[3] = {4*5*1, 4*1, 1};這樣在定位元素的時候,給出所在位置,就可以直接用對應的位置乘以陣列映像函式常量基址對應的值,得到所求元素的位置。
也是引用嚴蔚敏老師的書
陣列的結構體定義如下
typedef struct { ElemType *base; int dim; //陣列的維度 int *bounds; //陣列的維界基址,就是陣列的維度 //比如int a[3][4][5]; //bounds[0] = 3;bounds[1] = 4; bounds[2] = 5; int *constands; //陣列映像函式常量基址}
在定位一個數組元素的時候,比如要求a[2][2][4]元素的值,按照我們的常理,可以直接用
a[2][2][4] = x;來賦值或者取值,但是這裡定義的陣列維度是可以改變的,比如說8維,而且陣列的空間都是用malloc函式分配得到的,基址為結構體裡面的指標。這時就不能再用上面的方法求值或者複製。需要得到我們要賦值或者取值的元的地址,透過地址操作來進行值的獲取。
因為是a[3][4][5],所以a[2][2][4]的地址就是base+2*4*5+2*5+4*1;為了簡便,在結構體中設定了constands,它的初始化是
Array.constands = (int *)malloc(dim * sizeof(int));
正好是陣列維度大小的int型,而且A.constands[dim - 1] = 1;其他的是
A.constands[i] = A.bounds[i + 1] * A.constands[i + 1];
每個A.constands[i]代表比dim - i低一維的所有元素的個數,比如上面的a[3][4][5]對應的就是A.constands[3] = {4*5*1, 4*1, 1};這樣在定位元素的時候,給出所在位置,就可以直接用對應的位置乘以陣列映像函式常量基址對應的值,得到所求元素的位置。