在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;
}
数组要满足每一行都能对齐才行,否则在读写最后一行时容易因为缺少单元导致越界错误。
运行效果: