一種一維陣列或連續記憶體區轉多維陣列的方法
阿新 • • 發佈:2018-12-16
在C中建立的多維陣列,其實本質上都是分配符合容量大小的一維陣列,再分割成等份單位而成。除非使用堆空間動態分配則不適用:
https://blog.csdn.net/cjzjolly/article/details/84189136
例如陣列int array[3][3],其實實際是想申請了9個單元的連續儲存空間,然後新建3個指向該型別單元的指標的指標——例如本例子就是int array**,把0,3,6這幾個單元的地址抽出來——其跳躍規律為offset = y * width,寬度為你希望的二維表每行的寬,作為剛剛的3個指標的指標的值,即可把一維記憶體空間對映為二維陣列了。
例子如下:
#include "stdio.h" #include "stdlib.h" int main(){ int width = 3; int height = 3; int x, y; int arrayDiv1[width * height]; //1維陣列 int** arrayDiv2 = (int**) malloc(sizeof(int*) * height); //原地轉換為二維陣列 for(y = 0; y < height; y++){ int offset = y * width; arrayDiv2[y] = &arrayDiv1[offset]; } arrayDiv2[0][2] = 245; arrayDiv2[2][2] = 233; printf("%d\n", arrayDiv2[0][2]); printf("%d\n", arrayDiv2[2][2]); return 0; }
陣列要滿足每一行都能對齊才行,否則在讀寫最後一行時容易因為缺少單元導致越界錯誤。
執行效果: