Передати двовимірний статичний масив у функцію - stack overflow російською

Виникає проблема в передачі двовимірного статичного масиву в функцію

Намагався просто передати як int ** array int A [3] [4]; transp (A, 3, 4);

[Error] can not convert 'int (*) [3]' to 'int **'

  1. Як правильно передати статич масив у функцію. При цьому функція повинна також приймати динамічні масиви. Перевантаження, шаблони і STL не пропонувати.
  2. Статичні 2D масиви зберігаються в пам'яті лінійно. Динамічні зберігаються теж лінійно чи ні?
  3. Яку зв'язок має статичний 2D масив з покажчиками?

заданий 6 Листопада '15 о 18:53

Якщо у вас є масив, оголошений як

то нешаблонне функція, приймаюча даний масив як аргумент може виглядати, наприклад, як

і викликатися як

Або її можна оголосити як

Що стосується даної функції

то ви не можете в неї передати масив, оголошений як

Тобто передати можна, використовуючи різні хитрощі, але скоріше за все функція не працюватиме так, як ви припускаєте.

Є такий універсальний підхід. Це інтерпретувати будь-який двовимірний масив, як одновимірний, і передавати значення розмірів кожної розмірності масиву.

Ось демонстраційна програма

Її висновок на консоль

Якщо ж писати програму на C, а не на C ++, то там є масиви змінної довжини, і тому вам було б простіше.

У C ++ для цих цілей краще використовувати стандартний клас std :: vector

Що стосується вашого питання

2) Статичні 2D масиви зберігаються в пам'яті лінійно. Динамічні зберігаються теж лінійно чи ні?

то якщо ви будете розподіляти його в пам'яті як двовимірний масив, то природно його елементи будуть зберігатися лінійно по рядках. наприклад

А що стосується цього питання

3) Яку зв'язок має статичний 2D масив з покажчиками?

то будь-який масив в виразах (за рідкісним винятком) неявно перетвориться в покажчик на свій перший елемент.

У gcc зробити це зовсім просто.

Ви можете передавати у функцію розмірності матриці (досить тільки "нижчих") і звертатися до елементів за індексами естестственним чином. наприклад:

Ось приклад файлу, в якому представлені обидві версії програми і результати його запуску:

Якщо питання ще залишилися, задавайте.

Ось варіант з покажчиками на рядки "щільною" матриці.

Беремо статичну матрицю, робимо для неї масив покажчиків, передаємо його в функцію транспонування, яка робить в динамічної пам'яті "щільну" транспоновану матрицю і повертає новий масив покажчиків на її рядки.

Ну, пам'ять перед виходом Ви вже самі звільніть?