Проблема заключается в том, как рассчитываются адреса памяти.a[0]
является первым элементом, а a[1]
- вторым элементом, поэтому адрес a[1]
- это позиция a[0]
плюс размер элемента.Здесь нет проблем, адрес любого элемента может быть рассчитан с умножением позиции первого элемента на величину смещения, умноженную на размер элемента.
Как это работает с многомерными массивами?Каково расстояние между a[0][5]
и a[1][5]
?Ну, это зависит от размера строки (я использую эту терминологию для примера, в действительности нет никаких «строк»), так как в итоге это всего лишь один блок памяти.Если в строке 10 элементов, то расстояние в 10 раз превышает размер элемента.Таким образом, этот размер строки важен, без него невозможно точно определить местоположение элементов в массиве.Теперь с этим здесь:
void print2D(int ** ar,int r,int c)
Как он мог знать, что размер строки?ar[1][0]
- это первый элемент второй строки, поэтому, если строка имеет размер 10, то это будет 10-й элемент в блоке памяти.Однако, если размер строки равен 20, то это будет 20-й элемент, и это будет другой адрес.Так как бы он узнал?
Код не работает, потому что для вычисления адресов ему потребовалась бы информация, но он не имеет этой информации.