Чтобы решить эту проблему, вам нужно понять, как работают массивы в C.
Допустим, у вас есть матрица 3 * 3, которая объявлена так:
int matrix[3][3];
Пока вы представляете, что это квадрат вроде этого:
+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 3 | 4 | 5 |
+---+---+---+
| 6 | 7 | 8 |
+---+---+---+
Для компьютера это последовательная «строчка» в памяти, которая выглядит следующим образом:
+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+
^
|____matrix
А переменная matrix
содержит адрес первой ячейки
Итак, если вы хотите получить доступ к любой ячейке без использования оператора []
, вам необходимо вычислить адрес этой ячейки.
Давайте сделаем это для средней ячейки:
matrix[1][1];
Это вторая ячейка второй строки, поэтому вам нужно добавить ширину первой строки в начало матрицы, а затем добавить еще одну ячейку в начале второй строки. И вы хотите разыменовать адрес, чтобы получить значение следующим образом:
*(matrix + (3 * 1) + 1);
Что если нам нужна средняя клетка третьего ряда? То же самое, но добавьте ширину двух строк:
*(matrix + (3 * 2) + 1);
Подводя итог: если вы хотите получить доступ к ячейке x в строке y матрицы, вы бы рассчитали ее адрес следующим образом:
*(matrix + (with * y) + x);