TL; DR
Этот код содержит некорректные и бессмысленные хаки. Из этого кода мало что можно узнать.
Ниже приведено подробное объяснение.
Прежде всего, это простой одномерный массив, который печатается разными способами.
Эти строки являются строго говоря ошибками:
print2((int (*)[2]) a);
print3((int (*)[3]) a);
В обоих случаях происходит недопустимое преобразование указателя, поскольку a
имеет тип int[6]
и указатель на массив a
должен быть int (*)[6]
. Но операторы печати неверны и по-другому: a
при использовании в выражении, подобном этому, «разлагается» на указатель на первый элемент. Таким образом, код преобразуется из int*
в int(*)[2]
et c, что недопустимо.
Теоретически эти ошибки могут вызывать такие вещи, как неправильный доступ, представления прерываний или оптимизацию кода. На практике он, скорее всего, будет «работать» на всех основных компьютерах, даже если код полагается на неопределенное поведение.
Если мы проигнорируем эту часть и предположим, что void print2(int (*a)[2])
получает допустимый параметр, то a
- указатель на массив типа int[2]
.
a[i]
- арифметика указателя c на такой тип, что означает, что каждый i
будет соответствовать int[2]
, и если мы записав a++
, указатель будет прыгать вперед sizeof(int[2])
в памяти (вероятно, 8 байт).
Поэтому функция использует этот арифметический указатель c для a[i]
, чтобы получить номер массива i
, затем выполните [j]
в этом массиве, чтобы получить элемент в этом массиве.
Если у вас фактически был двумерный массив для начала, тогда может иметь смысл объявить функции как:
void print (size_t x, size_t y, int (*a)[x][y])
Хотя это будет раздражать, так как нам придется обращаться к массиву как (*a)[i][j]
. Вместо этого мы можем использовать тот же трюк, что и в вашем коде:
void print (size_t x, size_t y, int (*a)[x][y])
{
int(*arr)[y] = a[0];
...
arr[i][j] = whatever; // now this syntax is possible
Этот трюк также использует арифметику указателя c на указателе массива arr
, затем отменяет ссылки на массив, на который указывает.
Связанное чтение, которое объясняет эти понятия на примерах: Правильное размещение многомерных массивов