вопрос неясен, но вот некоторые мысли.
В языке нет многомерных массивов, поддерживаются только одномерные массивы с некоторыми дополнительными гарантиями. То, что обычно называют двумерным массивом, представляет собой массив 1D объектов массива типа данного типа. Дополнительные гарантии - это функции смежности и выравнивания: каждый элемент массива смежна со следующим элементом в массиве, а массив и первый элемент выравниваются.
Массивы имеют тенденцию к распада на указатель на первый элемент, и вы можете использовать арифметику указателей, чтобы перейти к следующему элементу в массиве, который является тем, что позволяет синтаксис A + 2
значение: &A[0] + 2
или указатель, является результатом добавления 2 в первый (нулевой) элемент в массиве. Но распад - это только верхний уровень.
Гарантии, изложенные до того, как вы можете использовать массив, как если бы он был указателем на первый элемент, и этот элемент находится в том же месте, что и сам массив. Применяя это рекурсивно к вложенному массиву, который вы можете получить на следующее:
int array[10][10];
// array is an array of 10 arrays of 10 int
// array[0] is an array of 10 int, the first subarray
// array[0][0] is an int, the first element of the subarray
int *p = &array[0][0];
int *q = p + 10; // One beyond the first subarray: pointer to the first
// element of the second subarray.
int *r = p + 10*row + col; // pointer to the col-th element inside the row-th subarray
// equivalent to &array[row][col]
Вы можете сделать то же самое, но зачем вам? –
A + rownum * ROWSIZE + colnum – bspikol
@bspikol: Нет, это неверно. Это даст вам указатель достаточно далеко от массива (в зависимости от значений rownum и ROWSIZE), и он будет неправильного типа (он будет указателем на массив из T вместо указателя на T) –