一种一维数组或连续内存区转多维数组的方法

在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;
}

数组要满足每一行都能对齐才行,否则在读写最后一行时容易因为缺少单元导致越界错误。

运行效果:

猜你喜欢

转载自blog.csdn.net/cjzjolly/article/details/84637768