考虑这个普通的数组分配:
int* a = ((int) * 10);
类型“int”当然是指向 int 的指针,并且 (a) == (int) 。 当我们执行[3]时,这会转化为:
*(a + 3)
其中 (假设 (long) == (void *)) 取消引用地址:
(长)a + 3*(*a) == (长)a + 3*(int)
考虑示例代码的方法是,类型“int(*rptr)[COLS]”是指向大小为 COLS 的整数(静态、一维)数组的指针。 换句话说, (*rptr) == COLS * (int) 。 然而,就像“int *”一样,我们可以分配这些固定大小的一维数组对象的数组。 索引“rptr[row]”翻译为:
*(rptr + 行)
解引用地址:
(长)rptr + 行*(*rptr) == (长)rptr + 行*COLS*(int)
结果类型为“int[COLS]”,因此可以通过“[col]”再次索引。 地址计算最终正是您想要的:
(长)rptr + 行*COLS*(int) + 列*(int)
参考资料中提到的这个解决方案只有在列数(或者通常除了第一维之外的所有列数)在编译时固定的情况下才有效。 随着维度数量的增加,语法会变得有点混乱。 如果您需要使用在运行时动态确定多个维度,请参阅该页面了解其他策略。