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

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

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

运行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值