Как передать в функцию двумерный массив.
В одной из статей, написанной несколько лет назад, описывал для чего в си используются указатели и как с ними работать. Сегодня перечитывая, ту статью понял, что есть еще один интересный вопрос, который стоило бы рассмотреть. «Как передать в функцию двумерный массив ?«
Ответ напрашивается сам собой, использовать для этого указатель. Но просто передать адрес первого элемента двумерного массива недостаточно(по сути указатель), давайте разберемся почему.
Несмотря на то, что двумерный массив, по сути представляет собой таблицу(массив элементами которого являются массивы), в памяти все его элементы хранятся последовательно и для того, чтобы в этой последовательности как-то ориентироваться необходимо знать размер его второй мерности. То есть если у нас есть массив arr[5][20], для работы с ним достаточно знать с какого адреса он начинается и что размер его второй мерности равен 20.
Тогда формула для вычисления адреса любого элемента массива будет иметь следующий вид
arr + 20*i + j
arr — адрес начала массива;
i — первый индекс элемента;
j — второй индекс элемента;
Двумерный массив можно использовать для хранения строк, описывающих какую-то сущность. В таком случае функция, модифицирующая его, будет выглядеть следующим образом.
void Update_List_Name(char *arr, uint8_t j) { char a; uint32_t adr; //первая буква первой строки имеет адрес начала массива adr = (arr+0*j+0); //вторая буква первой строки располагается по адресу adr = (arr+0*j+1) ; //вторая буква первой строки располагается по адресу adr = (arr+1*j+0) ; //вторая буква первой строки располагается по адресу adr = (arr+1*j+1) // для получения данных хранящихся в ячейке, // необходимо использовать операцию разыменования a = *adr; >
Аналогично можно передать указатель, указав размер второй мерности массива
void Update_List_Name(char *arr[20]) { char a; //в таком случае обращаться к элементам массива можно как обычно a = arr[1][2]; >
Или передать массив, указав размер его второй мерности.
void Update_List_Name(char arr[][20]) { char a; //в таком случае обращаться к элементам массива можно как обычно a = arr[1][2]; >
Какой способ из вышеприведенных использовать каждый решает сам, когда есть понимание сути, это не имеет большого значения.
Как передать двумерный массив в функцию 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++
Как передать двумерный массив в функцию c
что то не могу сообразить, как передать в функцию указатель на двумерный массив, без конверсии типов.
void main()
cons n=10;const m=10;
int array[n][m];
func1(array,n,m);
>
void func1(int *array, int n, int m)<>
Re: передать в функцию двумерный массив
| От: | VsevolodC | |
| Дата: | 20.12.04 13:24 | |
| Оценка: | -1 | |
void func1(int **array, int n, int m)<>
Re[2]: передать в функцию двумерный массив
| От: | MaximE |
| Дата: | 20.12.04 13:29 |
| Оценка: |
VsevolodC wrote:
>
> void func1(int **array, int n, int m)<> >
Не скастить int[n][m] к int**.
Объявление int[n][m] объявляет массив из n массивов int[m], поэтому каждый элемент массива [n] имеет тип int[m].
—
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re: передать в функцию двумерный массив
| От: | Bell |
| Дата: | 20.12.04 13:29 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>что то не могу сообразить, как передать в функцию указатель на двумерный массив, без конверсии типов.
void f(int (*arr)[10])
Но для этого нужно в compile-time знать вторую размерность (m в данном случае)
Любите книгу — источник знаний (с) М.Горький
Re[2]: передать в функцию двумерный массив
| От: | Кодт |
| Дата: | 20.12.04 13:33 |
| Оценка: |
Здравствуйте, VsevolodC, Вы писали:
VC>
VC>void func1(int **array, int n, int m)<> VC>
Быстро и неправильно.
Двумерный массив имеет тип int[N1][N2], и может быть приведён к указателю на одномерный массив: int(*)[N1], но никак не к указателю на массив указателей.
1) Язык Си в вопросах и ответах, 2.10 и2.11
2) отказаться от голых двумерных массивов в пользу С++ных обёрток
Перекуём баги на фичи!
Re: передать в функцию двумерный массив
| От: | MaximE |
| Дата: | 20.12.04 13:35 |
| Оценка: |
wrote:
> что то не могу сообразить, как передать в функцию указатель на двумерный массив, без конверсии типов.
>
> void main() > < >cons n=10;const m=10; > int array[n][m]; > func1(array,n,m); > > > > void func1(int *array, int n, int m)<>
func1(&array[0][0], n, m); // или func1(&**array, n, m);
Функция func1 должна доступаться к элементам массива так:
void func1(int *array, int n, int m) < int x = 5, y = 7; int elem = array[x * m + y]; >
—
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re[3]: передать в функцию двумерный массив
| От: | Аноним |
| Дата: | 20.12.04 13:36 |
| Оценка: |
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, VsevolodC, Вы писали:
К>1) Язык Си в вопросах и ответах, 2.10 и2.11
К>2) отказаться от голых двумерных массивов в пользу С++ных обёрток
ни можно так сделать, пишу программу для родственника, студента первого курса.
ни каких конверсий типов, обёрток, шаблонов, связанных списков. а то ему просто не поверят что это он писал
Re[2]: передать в функцию двумерный массив
| От: | Аноним |
| Дата: | 20.12.04 13:38 |
| Оценка: |
Здравствуйте, MaximE, Вы писали:
ME>Функция func1 должна доступаться к элементам массива так:
ME>
ME>void func1(int *array, int n, int m) ME> < ME>int x = 5, y = 7; ME> int elem = array[x * m + y]; ME>> ME>
я тоже думал об этом, если нет более родного для C способа придётся так.
Re[3]: передать в функцию двумерный массив
| От: | Bell |
| Дата: | 20.12.04 13:54 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, MaximE, Вы писали:
ME>>Функция func1 должна доступаться к элементам массива так:
ME>>
ME>>void func1(int *array, int n, int m) ME>>< ME>> int x = 5, y = 7; ME>> int elem = array[x * m + y]; ME>>> ME>>
А>я тоже думал об этом, если нет более родного для C способа придётся так.
Такое решение сразу же повлечет вопрос о правомочности подобного подхода, т.е. потребует рассказать о memory-layout встроенных массивов. А поскольку речь, как я понял, идет о начинающем, то подобные приемы могут вызвать некоторые подозрения С другой стороны, указатели на массивы тоже не очень распространены, а посему тоже могут быть отнесены к advanced (а следовательно «подозрительной») категории.
Так что я бы попробовал объяснить родственнику оба подхода, и выбрать более для него понятный.
Любите книгу — источник знаний (с) М.Горький
Re[4]: передать в функцию двумерный массив
| От: | ssm |
| Дата: | 20.12.04 14:29 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>ни можно так сделать, пишу программу для родственника, студента первого курса.
на экзамен тоже за него пойдешь?
Re[4]: передать в функцию двумерный массив
| От: | Кодт |
| Дата: | 20.12.04 14:32 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>ни можно так сделать, пишу программу для родственника, студента первого курса.
А>ни каких конверсий типов, обёрток, шаблонов, связанных списков. а то ему просто не поверят что это он писал
Насобачь его на обёртки (тем более, что это несложно), и пусть он объяснит преподу, что да, таки он сам это писал. Зауважають!
Перекуём баги на фичи!
Re: передать в функцию двумерный массив
| От: | Alexei_z_ |
| Дата: | 20.12.04 15:33 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>что то не могу сообразить, как передать в функцию указатель на двумерный массив, без конверсии типов.
А>void main()
А> <
А>cons n=10;const m=10;
А>int array[n][m];
А>func1(array,n,m);
А>>
А>void func1(int *array, int n, int m)<>
А>так не канает
int f1(int**&arr); int i1; int i2; int i3; int f1(int**&arr) < i1 =arr[0][0]; i2 = arr[1][1]; i3 = arr[9][9]; return 0; > int _tmain(int argc, _TCHAR* argv[]) < int** pi = new int* [10]; int i =0; int j =0; for (i =0;i<10;i++) < pi[i] = new int [10]; > for (i=0;i<10;i++) < for(j=0;j <10;j++) < pi[i][j] = i+j; >> f1(pi); return 0; >
Re[2]: передать в функцию двумерный массив
| От: | Alexei_z_ |
| Дата: | 20.12.04 15:39 |
| Оценка: |
func1(&**arr, n, m);
не откомпилится ( error C2528: ‘arr’ : pointer to reference is illegal)
нужно func1(int **&arr, m,n)
Re[2]: передать в функцию двумерный массив
| От: | Alexei_z_ |
| Дата: | 20.12.04 15:42 |
| Оценка: |
Здравствуйте, Alexei_z_, Вы писали:
A__>Здравствуйте, Аноним, Вы писали:
А>>что то не могу сообразить, как передать в функцию указатель на двумерный массив, без конверсии типов.
А>>void main()
А>> <
А>>cons n=10;const m=10;
А>>int array[n][m];
А>>func1(array,n,m);
А>>>
А>>void func1(int *array, int n, int m)<>
А>>так не канает
A__>int f1(int**&arr); A__>int i1; A__>int i2; A__>int i3; A__>int f1(int**&arr) A__> < A__>i1 =arr[0][0]; A__> i2 = arr[1][1]; A__> i3 = arr[9][9]; A__> return 0; A__>> A__>int _tmain(int argc, _TCHAR* argv[]) A__> < A__>int** pi = new int* [10]; A__> int i =0; A__> int j =0; A__> for (i =0;i <10;i++) A__> < A__>pi[i] = new int [10]; A__> > A__> for (i=0;i <10;i++) A__> < A__>for(j=0;j <10;j++) A__> < A__>pi[i][j] = i+j; A__> > A__> > A__> f1(pi); A__> return 0; A__>> A__>
Re[4]: передать в функцию двумерный массив
| От: | Аноним |
| Дата: | 20.12.04 16:09 |
| Оценка: |
Здравствуйте, Bell, Вы писали:
А>>я тоже думал об этом, если нет более родного для C способа придётся так.
B>Такое решение сразу же повлечет вопрос о правомочности подобного подхода, т.е. B>потребует рассказать о memory-layout встроенных массивов. А поскольку речь, как я B>понял, идет о начинающем, то подобные приемы могут вызвать некоторые подозрения
на самом деле о устройстве встроенныч массивов в C, преподаватели вынуждены рассказывать даже самым начинающим, иначе не объяснить принцип функционирования указателей.
B> С другой стороны, указатели на массивы тоже не очень распространены, а посему тоже B>могут быть отнесены к advanced (а следовательно «подозрительной») категории.
Re[2]: передать в функцию двумерный массив
| От: | Кодт |
| Дата: | 20.12.04 16:44 |
| Оценка: |
Здравствуйте, Alexei_z_, Вы писали:
A__>
A__>int _tmain(int argc, _TCHAR* argv[]) A__> < A__>int** pi = new int* [10]; A__> int i =0; A__> int j =0; A__> for (i =0;i <10;i++) A__> < A__>pi[i] = new int [10]; A__> > A__> for (i=0;i <10;i++) A__> < A__>for(j=0;j <10;j++) A__> < A__>pi[i][j] = i+j; A__> > A__> > A__> f1(pi); A__> return 0; A__>> A__>
Тогда уж нужно писать внешние функции размещения-освобождения:
int** alloc2d(unsigned xs, unsigned ys) < if(xs==0) xs=1; // Маленькая хитрость - позволяет создавать валидные двухмерные массивы нулевого размера // придерживаемся семантики new[] - возвращаем ненулевой указатель даже на пустой массив // Единственно, где мы отступаем от правил: если ys==0, то все подмассивы оказываются по одному адресу // Делать // if(ys==0) ys=1; // нельзя по тем соображениям, что для типов с нетривиальным конструктором/деструктором // мы выполним конструирование ненужных объектов int* flat = new int[xs*ys]; // Во-первых, незачем создавать xs отдельных блоков; во-вторых, так удобнее удалять int** ptrs = new int*[xs]; for(unsigned x=0; xreturn ptrs; > void free2d(int** ptrs) // из предположения, что выделено с помощью alloc2d < if(ptrs) < delete[] ptrs[0]; // ptrs[0] указывает на flat delete[] ptrs; > >
Перекуём баги на фичи!
Re[3]: передать в функцию двумерный массив
| От: | Alexei_z_ |
| Дата: | 20.12.04 17:10 |
| Оценка: |
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Alexei_z_, Вы писали:
A__>>
A__>>int _tmain(int argc, _TCHAR* argv[]) A__>>< A__>> int** pi = new int* [10]; A__>> int i =0; A__>> int j =0; A__>> for (i =0;i<10;i++) A__>> < A__>> pi[i] = new int [10]; A__>> > A__>> for (i=0;i<10;i++) A__>> < A__>> for(j=0;j<10;j++) A__>> < A__>> pi[i][j] = i+j; A__>> > A__>> > A__>> f1(pi); A__>> return 0; A__>>> A__>>
К>Тогда уж нужно писать внешние функции размещения-освобождения:
К>
К>int** alloc2d(unsigned xs, unsigned ys) К> < К>if(xs==0) xs=1; К> // Маленькая хитрость - позволяет создавать валидные двухмерные массивы нулевого размера К> // придерживаемся семантики new[] - возвращаем ненулевой указатель даже на пустой массив К> // Единственно, где мы отступаем от правил: если ys==0, то все подмассивы оказываются по одному адресу К> // Делать К> // if(ys==0) ys=1; К> // нельзя по тем соображениям, что для типов с нетривиальным конструктором/деструктором К> // мы выполним конструирование ненужных объектов К> int* flat = new int[xs*ys]; К> // Во-первых, незачем создавать xs отдельных блоков; во-вторых, так удобнее удалять К> int** ptrs = new int*[xs]; К> for(unsigned x=0; x ptrs[x] = flat + x*ys; К> return ptrs; К>> К>void free2d(int** ptrs) // из предположения, что выделено с помощью alloc2d К> < К>if(ptrs) К> < К>delete[] ptrs[0]; // ptrs[0] указывает на flat К> delete[] ptrs; К> > К>> К>
Согласен,
но тогда уже
templateclass T> T** alloc2d(unsigned xs, unsigned ys) < if(xs==0) xs=1; T* flat = new T[xs*ys]; T** ptrs = new T*[xs]; for(unsigned x=0; xreturn ptrs; > . int **pi =alloc2dint>(10,10);
То же самое для free2d(int** ptrs);
Re[3]: передать в функцию двумерный массив
| От: | MaximE |
| Дата: | 20.12.04 17:17 |
| Оценка: |
Alexei_z_ wrote:
> ME>// или
> ME>func1(&**array, n, m);
> ME>[/c]
>
> func1(&**arr, n, m);
> не откомпилится ( error C2528: ‘arr’ : pointer to reference is illegal)
Это не прототип ф-ции, а ее вызов Что, естественно, не может не скомпилироваться.
> нужно func1(int **&arr, m,n)
В контексте топика, это объявлении ф-ции лишено смысла.
—
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re[4]: передать в функцию двумерный массив
| От: | Кодт |
| Дата: | 20.12.04 17:27 |
| Оценка: |
Здравствуйте, Alexei_z_, Вы писали:
A__>templateclass T> T** alloc2d(unsigned xs, unsigned ys) A__>
A__>То же самое для free2d(int** ptrs);
Главное, идею ухватить Тем более, что студент-первокурсник, ему про шаблоны знать не положено
Перекуём баги на фичи!
Re[5]: передать в функцию двумерный массив
| От: | Alexei_z_ |
| Дата: | 20.12.04 17:37 |
| Оценка: |
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Alexei_z_, Вы писали:
К> < ух, наоверквотил! >
A__>>Согласен,
A__>>но тогда уже
A__>>
A__>>templateclass T> T** alloc2d(unsigned xs, unsigned ys) A__>>
A__>>То же самое для free2d(int** ptrs);
К>Главное, идею ухватить Тем более, что студент-первокурсник, ему про шаблоны знать не положено
Честно говоря, думаю, студенту капут на первом же вопросе по его коду. Пусть хоть погибнет красиво.
Как передать двумерный массив в функцию c
Подскажите, пожалуйста, можно ли передать двумерный массив в функцию без использования указателей? Мне просто интересно. Если да, то как? С одномерным массивом это проходит. И изменения вносятся.
#include using namespace std; void fillArray(int Arr[], int size) < for (int i = 0; i < size; i++) < Arr[i] = i + 1; >> void showArr(int Arr[], int size) < for (int i = 0; i < size; i++) < cout > //================================== int main()
| marenko.lilia |
| Посмотреть профиль |
| Найти ещё сообщения от marenko.lilia |
Регистрация: 31.05.2010
Сообщений: 13,964
А чем не нравятся указатели? Лень две звёздочки поставить?
Пишем void function(int **A)<> и радуемся.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
| Smitt&Wesson |
| Посмотреть профиль |
| Найти ещё сообщения от Smitt&Wesson |
Пользователь
Регистрация: 25.12.2013
Сообщений: 91
Сообщение от Smitt&Wesson
А чем не нравятся указатели? Лень две звёздочки поставить?
Пишем void function(int **A)<> и радуемся.
Всё нравится )) И указатели, и две звездочки.
Но интересно человеку! Понимаете??
И почему надо использовать указатели в этом случае, если возможно и без них мы можем обойтись?
| marenko.lilia |
| Посмотреть профиль |
| Найти ещё сообщения от marenko.lilia |
Регистрация: 22.05.2007
Сообщений: 9,507
В С++ нет понятия двумерного массива, соответственно нет никакого специального для них механизма.
Пользователь
Регистрация: 25.12.2013
Сообщений: 91
Оказывается можно!
Немного поэкспериментировала — то получатся так:
#include using namespace std; void showArr(int Arr[][10], int size) < for (int i = 0; i < size; i++) < for (int j = 0; j < size; j++) cout > void fillArray(int Arr[][10], int size) < for (int i = 0; i < size; i++) < for (int j = 0; j < size; j++) Arr[i][j] = i; >> //================================== int main()
Главное при определении функции указать количество столбцов.
Тоже мне «профессионалы» Лишь бы поумничать.
| marenko.lilia |
| Посмотреть профиль |
| Найти ещё сообщения от marenko.lilia |
Регистрация: 31.05.2010
Сообщений: 13,964
Сообщение от marenko.lilia
Оказывается можно!
Тоже мне «профессионалы» Лишь бы поумничать.
У каждого свой стиль. Я статическими массивами не пользуюсь, а динамические в функцию передаются по указателям.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
| Smitt&Wesson |
| Посмотреть профиль |
| Найти ещё сообщения от Smitt&Wesson |
Пользователь
Регистрация: 25.12.2013
Сообщений: 91
Согласна.
Мне просто интересно было разобраться можно ли так сделать, как спрашивала.
Если вас задело — не обижайтесь ) Это шутка была! По Вам то видно, что Вы дядя серьезный ))
| marenko.lilia |
| Посмотреть профиль |
| Найти ещё сообщения от marenko.lilia |
Регистрация: 31.05.2010
Сообщений: 13,964
Сообщение от marenko.lilia
Согласна.
Мне просто интересно было разобраться можно ли так сделать, как спрашивала.
Если вас задело — не обижайтесь ) Это шутка была! По Вам то видно, что Вы дядя серьезный ))
Я ещё и весёлый. Шутки понимаю .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
| Smitt&Wesson |
| Посмотреть профиль |
| Найти ещё сообщения от Smitt&Wesson |
Регистрация: 16.12.2011
Сообщений: 2,329
Сообщение от marenko.lilia
Подскажите, пожалуйста, можно ли передать двумерный массив в функцию без использования указателей?
#include using namespace std; template void fillArray(int (&Arr)[N]) < for (int i = 0; i < N; i++) Arr[i] = i + 1; >template void showArr(const int (&Arr)[N]) < for (int i = 0; i < N; i++) cout //================================== int main()
Обратите внимание: размер сишного массива известен времени компиляции, поэтому передавать его размер в качестве аргумента функции не нужно.
Компилятор вычислит размер массива автоматически.
Сообщение от Smitt&Wesson
У каждого свой стиль. Я статическими массивами не пользуюсь, а динамические в функцию передаются по указателям.
На языке с++ не существует динамических массивов.
Последний раз редактировалось Stilet; 02.09.2014 в 19:35 .
Регистрация: 16.12.2011
Сообщений: 2,329
Сообщение от marenko.lilia
Оказывается можно!
void showArr(int Arr[][10], int size)
Вы ошиблись: в данном случае вы передали указатель.
Пусть вас не смущает отсутствие звездочки - это наследие языка си.
На языке си для массивов существует альтернативный синтаксис для аргументов функций являющихся массивами.
Вообще, у вас есть три способа передать данные в функцию:
1. По значению. В функцию передается копия аргумента.
2. По указателю. В функцию передается указатель, который инициализирован адресом аргумента.
3. По ссылке. В функцию передается ссылка аргумента.
Поскольку массив нельзя передать по значению - у него нет конструктора копии, то остается передавать либо по ссылке, либо по указателю.
На языке си нет ссылок, только указатели.
Поэтому единственный способ для языка си обеспечить данный синтаксис - передача по указателю.
#include #include using namespace std; void showArr(int Arr[][10], int size) < cout::value int main()
Резюмируя: если хотите передать массив в функцию не через указатель, то передавайте по ссылке.