java 多维动态数组_C中的动态多维数组

考虑这个普通的数组分配:

int* a = malloc(sizeof(int) * 10);

类型“int ”当然是指向int的指针,而sizeof( a)== sizeof(int) . 当我们做[3]时,这将转换为:

*(a + 3)

其中(假设sizeof(long)== sizeof(void *))取消引用地址:

(long)a + 3*sizeof(*a) == (long)a + 3*sizeof(int)

考虑示例代码的方法是类型“int(* rptr)[COLS]”是指向大小为COLS的(静态,一维)int数组的指针 . 换句话说,sizeof(* rptr)== COLS * sizeof(int) . 但是,就像“int *”一样,我们可以分配这些固定大小的一维数组对象的数组 . 索引“rptr [row]”转换为:

*(rptr + row)

取消引用地址:

(long)rptr + row*sizeof(*rptr) == (long)rptr + row*COLS*sizeof(int)

结果类型为“int [COLS]”,因此可以通过“[col]”再次索引 . 地址计算最终正是您想要的:

(long)rptr + row*COLS*sizeof(int) + col*sizeof(int)

此解决方案在http://c-faq.com/aryptr/dynmuldimary.html中提及,仅在编译时固定列数(或通常除第一维之外的所有列)时才有效 . 随着维度数量的增加,语法会变得有点混乱 . 如果您需要在运行时动态确定多个维度,请参阅该页面以了解其他策略 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值