Как передать двумерный массив в функцию c

от admin

Передать 2D-массив функции в качестве параметра в C

В этом посте будет обсуждаться, как передать 2D-массив функции в качестве параметра в C.

в предыдущий пост, мы обсудили, как динамически выделять память для двумерного массива. В этом посте мы обсудим, как мы можем передать 2D-массив в функцию языка программирования C.

1. Для статического массива

Если мы знаем границы массива во время компиляции, мы можем передать статический 2D-массив функции на C, как показано ниже:

23.2. Передача двумерных массивов в функции

Вместо одномерного массива функции передается указатель на его первый элемент. Точно так же не передается функции и двумерный массив. Массив массивов (т.е. двумерный массив в языке С) при передаче в функцию превращается в указатель на массив, а не в указатель на указатель. В функцию передается указатель на массив, число элементов которого равно длине строки двумерного массива.

Следующее описание является неверным:

Если в функцию передается двумерный массив:

описание функции должно соответствовать

Скобки (*pmas) в объявлении обязательны, т.к. int *pmas[M] – это массив указателей на int, а не указатель на массив.

Обратить внимание! Так как функция не выделяет место для массива, нет необходимости знать его точный размер. Поэтому количество строк N может быть опущено. В то же время количество элементов в строке (количество столбцов M) опускать нельзя, т.к. «форма» массива (количество столбцов) используется для вычисления смещения элемента относительно начала массива. Поэтому количество столбцов (вторую размерность M) надо указывать обязательно.

Задача. Разработать функции для печати массива из 10 столбцов и замены знака у всех элементов массива с 5-ю столбцами.

void print10(int mas[][10], int n) <

void negative5(int (*mas)[5], int n, int m) <

Обратить внимание! У двумерных (многомерных) массивов есть один неприятный недостаток при передаче их в функцию – для обработки массива с пятью столбцами нужно писать одну функцию, а для массива с десятью столбцами – другую!

При передаче функции двумерного массива как фактического параметра необходимо обязательно указывать количество столбцов. Однако, если работа с двумерным массивом не требует доступа к элементам посредством конкретного указания строк и столбцов, то функция может воспринимать многомерный массив как одномерный, хотя в качестве фактического параметра ей передается многомерный массив.

long sum(int m[], int n) <

for (i = 0; i < n; i++)

printf(«Сумма массива a = %d\n», sum(a, 10));

printf(«Сумма массива b = %d\n», sum((int *)b, 20));

printf(«Сумма массива c = %d\n», sum((int *)c, 30));

Функция sum() работает с двумерными массивами так же, как и с одномерными массивами. Так работать с двумерным массивом позволяет способ хранения в памяти многомерных массивов в языке С. Правда, есть одно ограничение – реальное количество элементов в строке такого массива должно строго совпадать со второй размерностью массива, а вот количество строк в таком массиве может быть любым.

Читать:
Как поговорить с нейросетью

Как правильно передать двумерный массив в функцию?

но если указать вместо size, конкретную цифру то все сработает.

Как в первом случае отправить массив в функцию ? Подскажите самый оптимальный вариант.

  • Вопрос задан более трёх лет назад
  • 6417 просмотров
  • Facebook
  • Вконтакте
  • Twitter

  • Facebook
  • Вконтакте
  • Twitter

myjcom

myjcom

С-массивы в функции можно передавать только по ссылке. Или преобразовать в массив указателей.

Вообще, для передачи С-массивов придуман std::array , но двумерный C-массив нельзя напрямую привести к std::array<std::array<int, M>, N> . Но можно изначально работать с std::array :

  • Facebook
  • Вконтакте
  • Twitter

Если вы изучаете С++, то лучше использовать классы стандартной библиотеки для массивов. В функцию передаете ссылку на класс.
В чистом Си передается просто указатель и размер в отдельном параметре (или 2 размера для двумерного массива).
Сам двумерный массив может быть представлен в двух вариантах:
1.Как массив указателей, где каждый указатель представляет собой одномерный массив. Нужно отдельно выделять память для массива указателей и для каждого одномерного подмассива и аналогично освобождать. В этом случае возможна операция индексации обоих измерений массива, при этом массив указателей и каждый подмассив могут находится в разных участках памяти.

2.Как одномерный массив размерностью N * M. В этом случае память под массив выделяется и освобождается вся оптом одним куском, но операция индексации первых размерностей не возможна. Но можно легко переходить от двумерного массива к одномерному, сразу вычислять нужный индекс или просто перемещаться по элементам массива с помощью временного указателя.

Передача двумерного массива в качестве аргумента функции

Никак не могу разобраться с передачей двумерного массива в функцию, и вывода его этой функцией на экран. И какими ещё способами можно передать двумерный массив в функцию?

Аргумент функции двумерный массив

Yaroslav's user avatar

Может быть в общем случае лучше всего передавать в функцию размеры массива и адрес его первого элемента (т.е. представлять в функции этот массив как одномерный) и самостоятельно вычислять нужный индекс при обращении к элементам массива.

Например, для двумерного массива:

Этот способ работает во всех Си и С++ компиляторах.

А вот в gcc (C, не С++) этот же пример можно написать и более естественным образом:

Обратите внимание, количество элементов в строке массива должно передаваться перед его объявлением в списке аргументов.

При вызове передаем сам массив (а не адрес первого элемента, как в первом примере).

Похожие статьи