Это выделяет один блок памяти для хранения двумерного массива в виде массива массивов. C массивы массивов хранятся в виде массива указателей на дальнейшие массивы; Моей первой мыслью было «гадость», но здесь есть некоторая элегантность в том, что все возвращается как один блок памяти, который может быть освобожден () за один go впоследствии.
Этот код
- выделяет место для int-указателей (sizeA * sizeB), а затем 2 * sizeA * sizeB; сохраните это как указатель типа int **, т.е. мы будем использовать первый блок этого как верхний уровень нашего 2D-массива
- (код, который вы указали) устанавливает указатели для массива верхнего уровня, чтобы указать к двум целым блокам оставшейся памяти
- использует двумерный массив для хранения пар значений в диапазоне 0-sizeA, 0-sizeB
Как перенести это на C#? Это зависит от того, как вы хотите использовать сгенерированные значения. Я бы, вероятно, сделал это массивом значений:
var array = Enumerable.Range(0, sizeA).SelectMany(a =>
Enumerable.Range(0, sizeB).Select(b => (a,b))).ToList();
или .ToArray()
. Если вам нужна версия с зубчатыми массивами, вы можете вместо этого new[] { a, b }
во внутреннем выделении.