Как правильно передать двумерный массив в функцию?
но если указать вместо size, конкретную цифру то все сработает.
void foo(int arr[][5]) < . >int arr[5][5] = <>;
Как в первом случае отправить массив в функцию ? Подскажите самый оптимальный вариант.
- Вопрос задан более трёх лет назад
- 8094 просмотра
Решения вопроса 3

Roman @myjcom Куратор тега C++
const int size
Массив не передается. Передается указатель. Даже если вы пишете a[][size]
Ответ написан более трёх лет назад
Нравится 1 2 комментария

Roman @myjcom Куратор тега C++
Размер массива должен быть известен на этапе компиляции.

Roman @myjcom Куратор тега C++
int sum; неинициализированная переменная
#include template int foo(int (&matrix)[ColumnCount][RowCount]) < int r = 0; for(auto& row: matrix)< for(auto& x: row) r += x; >return r; > int bar()< int matrix [][2] = , , >; return foo(matrix); >
С-массивы в функции можно передавать только по ссылке. Или преобразовать в массив указателей.
Вообще, для передачи С-массивов придуман std::array , но двумерный C-массив нельзя напрямую привести к std::array, N> . Но можно изначально работать с std::array :
template int foo(std::array, ColumnCount>& matrix) < int r = 0; for(auto& row: matrix)< for(auto& x: row) r += x; >return r; > int bar()< std::array, 3> matrix = , , >>; return foo(matrix); >
Ответ написан более трёх лет назад
Нравится 1
Developer, ex-admin
Если вы изучаете С++, то лучше использовать классы стандартной библиотеки для массивов. В функцию передаете ссылку на класс.
В чистом Си передается просто указатель и размер в отдельном параметре (или 2 размера для двумерного массива).
Сам двумерный массив может быть представлен в двух вариантах:
1.Как массив указателей, где каждый указатель представляет собой одномерный массив. Нужно отдельно выделять память для массива указателей и для каждого одномерного подмассива и аналогично освобождать. В этом случае возможна операция индексации обоих измерений массива, при этом массив указателей и каждый подмассив могут находится в разных участках памяти.
void foo(int ** arr, int N, int M) < . >int main() < int N = 10; // первое измерение массива int M = 20; // второе измерение массива int ** arr = new int * [N]; for(int i = 0; i < M; ++i) < arr[i] = new int[M]; >. foo(arr, N, M); . // Тут освобождение массива аналогично выделению в обратном порядке >
2.Как одномерный массив размерностью N * M. В этом случае память под массив выделяется и освобождается вся оптом одним куском, но операция индексации первых размерностей не возможна. Но можно легко переходить от двумерного массива к одномерному, сразу вычислять нужный индекс или просто перемещаться по элементам массива с помощью временного указателя.
void foo(int * arr, size_t N, size_t M) < . >int main() < int N = 10; // первое измерение массива int M = 20; // второе измерение массива int * arr = new int * [N*M]; int * arrcur = arr; // временный указатель для обхода массива int * arrone = arr; // вариант с переходом к одномерному массиву for(int i = 0; i < N; ++i) < for(int j = 0; j < M; ++j) < // Вариант с вычислением адреса текущего элемента по индексам *(arr + i * M + j) = rand() % 10; // вычисление нужного индекса на месте // Вариант с обходом массива с помощью временного указателя *arrcur = rand() % 10; ++arrcur; // переход к следующему элементу // Вариант с переходом к одномерному массиву arrone[j] = rand() % 10; >arrone += M; > . foo(arr, N, M); . delete[] arr; >
Как передать двумерный статический массив в функцию на Си?
Есть массив char mass[1024][1024] и функция int fun(char*) . При вставке функции fun(mass) , компилятор выдаёт предупреждение о несоответствии типов, приходиться приводить тип fun((char*)mass)<> или fun((char*)&mass)<> . Есть ли возможность для указания статического массива как аргумента? И почему типы разные?
- Вопрос задан более трёх лет назад
- 2801 просмотр
Комментировать
Решения вопроса 1
Не ИТ-специалист
Целиком массив в функцию не передаётся (если только не обернуть его в структуру), а передаётся указатель на его 0-й элемент и формальный аргумент функции должен быть указателем на тип элементов массива, передаваемого фактическим аргументом.
n-мерный массив — это 1-мерный массив (n-1)-мерных массивов и, соответственно, формальным аргументом функции должен быть указатель на (n-1)-мерный массив.
В данном случае
int fun(char (*)[1024]); int fun(char (*m)[1024])*. */>
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Данил Тунев @lada-guy Автор вопроса
Спасибо, очень логично,в выходные заценю
Ответы на вопрос 1
«I’m here to consult you» © Dogbert
Есть массив char mass[1024][1024] и функция int fun(char*)
в такую функцию можно передать fun(&mass[0][0]) .
Есть ли возможность для указания статического массива как аргумента?
В смысле массива статической размерности? Легко: int fun(char a[][1000]); . fun(mass);
Ответ написан более трёх лет назад
Данил Тунев @lada-guy Автор вопроса
Компилятор gcc не разрешает такого рода аргументы: int fun(char mass[][1000]); Только с помощью указателей передаются массивы. В общем разобрался, спасибо за ответ!
Компилятор gcc не разрешает такого рода аргументы: int fun(char mass[][1000])
О, как интересно. Данил Тунев расскажи мне, почему, а то я даже отдалённо не вижу никаких проблем?
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C++
- +1 ещё
В чем ошибка кода?
- 1 подписчик
- 7 часов назад
- 97 просмотров
Как передать многомерный массив в функцию c
Передать статический двумерный массив в функцию так, чтобы можно было получать доступ к его элементам через синтаксис a[x][y] можно только используя технику динамических массивов.
Однако есть более простой способ доступа к данным массива путем передачи указателя на первый элемент двумерного массива. При этом двумерный массив внутри функции будет выглядеть как одномерный массив указателей на одномерные массивы, и доступ к элементам нужно осуществлять с помощью конструкции [y*размерность_x+x].
Вот первый пример, как можно передавать двумерный массив:
void fun(int **array, int sizey, int sizex)
value=p_array[ y * sizex + x ]; // [ x ][ y ]
fun((int**)table, 5, 4);
Как видно, синтаксис неудобен, и внутри функции fun() для доступа к элементам используется создание дополнительного указателя.
Есть более простой вариант для передачи двумерных массивов, размер которых заранее известен:
#define TABLE_SIZE_X 5
#define TABLE_SIZE_Y 4
Передача динамического массива в функцию выполняется другими методами.
- Стандарт языка программирования Си
- Передача параметра в функцию по указателю в C стиле
- Передача параметров в функцию по указателю (C стиль) и по ссылке (C++ стиль)
- Передача структуры в функцию и изменение значений элементов структуры
- В чем разница объявления строки как массива и как указателя
- Использование очень больших чисел
- getch() в Linux
- Аргументы функции main()
- Как побайтно считать файл
- Реализация циклического сдвига ROR и ROL
- Динамическая загрузка библиотек в Linux
- Функция fmemopen() — открытие набора байт как файла в памяти с получением файлового дескриптора
- Подмена дефайнов (#define)
- Успешной отладки, шутка
- Как описывать функции с аргументами по-умолчанию в C/C++
- Форматированный вывод через функцию printf
- Создание и удаления двухмерного и трехмерного динамического массива
- Как передать в функцию двумерный массив, размер которого известен
- Как передать в функцию динамический двумерный массив
- Как правильно читать объявления в Си
- Вычисление pbkdf2 на языке C
- Определение разрядности платформы 32 или 64 бит
- Функции getuid() и geteuid()
- Указатели и символьные строки в языке C
- Практическое применение LD_PRELOAD или замещение функций в Linux
- Проблемы C-подобных языков. Где находиться типу: справа или слева? (Теория)
- Откуда в языке Си появился синтаксис указателей, и для чего он предназначался изначально
- Как в языке Си вызвать функцию, для которой известен адрес вызова в виде числа
- Вызов функции по известному адресу в языке Си — абстрактный тип данных указателя на функцию
- Структуры в языке Си. Определения структур в сравнении с языком C++
- Структуры в языке Си. Указатели на структуры
- Структуры в языке Си. Массивы структур
- Операция запятая «,» в языке Си и Си++
- Самый быстрый и оптимальный способ копирования строк в Cи и C++
Передать 2D-массив в качестве параметра функции в C++
В этом посте мы обсудим, как передать двумерный массив в качестве параметра функции на языке программирования C++.
1. Статический массив
Если нам известны размеры массива во время компиляции, мы можем передать массив по ссылке, используя шаблон функции в C++, как показано ниже:
#define M 5
#define N 5
// создаем шаблон функции
void assign ( int ( &arr ) [ r ] [ c ] )
for ( size _ т i = 0 ; i < r ; i ++ )
for ( size _ т j = 0 ; j < c ; j ++ ) <
arr [ i ] [ j ] = i + j ;
// Программа для передачи 2D-массива в качестве параметра функции на C++
int arr [ M ] [ N ] ;
assign ( arr ) ;
// печать двумерного массива
Преимущество использования этого подхода заключается в том, что нет необходимости указывать размеры массива. Недостатком использования этого подхода является то, что мы не можем использовать его с динамическими массивами.
Мы также можем создать оболочку над функцией, как показано ниже, что более эффективно для больших массивов: