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

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

  • автор:

AncellX / 2017-03-27 Two-dimensional arrays.md

Для объявления двумерного динамического массива нужен указатель на указатель. Двумерный динамический массив объявляется следующим образом:

1 — выделяется память под массив указателей и в адрес выделенной памяти записывается указатель на указатель.

2 — в цикле for обращаемся к каждому элементу массива указателей и записываем в него адрес одномерного динамического массива также выделяемого оператором new .

Обращение к элементам двумерного динамического массива

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

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

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

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

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

Как сделать передачу двумерного массива через параметр функции?

Либо создаёшь массив динамически:

Тогда можно написать функцию:

и использовать её прямо: f(arr);

Если же твой двумерный массив статический, то тебе обязательно нужно в объявлении функции указать одну (вторую) размерность:

Вот она, моя функция:

float det(float p[][], int n)

else add[х-1][y-1] = p[y][х];

det += p[i][0]*det(add, n-1))

Попытался перевести на указатели, получилось вот что:

float det(float **p, int n)

for(int i=0; int m=n>i; i++) <

float **add = new float*[n-1];

for(int i=0; i<n-1; i++) add[i] = new float[n-1];

else add[х-1][y-1] = p[y][х];

static float det;

det += p[i][0]*det(add, n-1); // вот здесь ошибка, не хочет вызываться [C++ Error] Call of nonfunction

А ещё можно ли как-нибудь за счёт параметра n указать сразу в параметре массива его размерность типа (n, m[n][n]).

void func(char mas[10][5]);

Ну, какие есть замечания:

1) Зачем тебе две переменных det — одна static, другая auto ??

2) Почему переменная det называется так же, как и функция? Или в латинском алфавите букв мало 😕 Тогда используй знак подчёркивания и цифры (цифры — не в начале). Компилятор, собственно, на это и ругается.

3) Если ты выделил память под переменную с помощью оператора new, то, когда она больше не нужна, освободи ресурс оператором delete. Пример

int* pa = new int;

Используй оператор delete[] для освобождения памяти для целого массива. Для двумерного массива это будет выглядеть так:

Передача двумерного динамического массива в функцию (Си)

Подскажите как правильно передать двумерный динамический массив в функцию. Функция не возвращает значения (void), массив в ней должен изменяться. При передачи в аргумент просто int **Arr, создается копия и изменяется только копия, мне же нужно чтобы изменялся именно передаваемый через аргументы массив.

Во-первых, «возвращаемые» параметры вам в такой ситуации придется передавать «по указателю». Так как сами «возвращаемые» параметры имеют тип int ** , то при передаче «по указателю» они превратятся в int ***

Во-вторых, чтобы не путаться в «звездочках», выделение памяти я бы порекомендовал делать через следующую идиому

(и заодно избавиться от манеры явно приводить результат malloc )

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

При вызове такой функции, разумеется, надо не забывать передавать именно указатели на указатели-приемники

Но, вообще говоря, код надо было бы переделать по другому. Функции, которая читает две матрицы быть не должно. Должна быть функция, которая читает только одну матрицу из данного файла из возвращает ее через возвращаемое значение

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *