Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/56: Рейтинг темы: голосов - 56, средняя оценка - 4.68
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258

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

03.08.2013, 09:08. Показов 12374. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые жители Cyber-Forum. Не так давно я начал самостоятельно изучать Си++, и если честно, то ето вообще мой первый опыт в программировании, поэтому в процессе изучения накапливаются вопросы, на которые некому ответить. Мой вопрос уже задавался ранее неоднократно, так что он вряд ли покажется вам чем-то новым, но я спрошу, так как в прочитанных мноу темах я не смог удовлетворить своё любопытство.

Допустим, у нас есть статический двумерный массив
C++
1
int example[ rowSize ][ columnSize ];
где rowSize и columnSize - это некоторые константы:
C++
1
2
const int rowSize = 5;
const int columnSize = 7;
Как тогда будет выглядеть прототип некой функции someFunction, которая принимала бы в качестве аргумента этот массив?
Как вы можете видеть, число строк и столбцов зависит от констант rowSize и columnSize.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2013, 09:08
Ответы с готовыми решениями:

Передача двумерного статического массива в функцию
#include "stdafx.h" #include <iostream> #include <time.h> #include <cstdlib> #include <fstream> using namespace std; void...

Передача двумерного статического массива в функцию
динамический массив передаётся (строки в комментах), статический - нет. в чём причина ? #include<iostream> using namespace...

Передача статического двумерного массива в функцию
Добрый вечер. Вот один из способов передачи статической матрицы в ф-ию: void f(int arr) { ... } Подскажите, что на самом...

28
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
03.08.2013, 09:17
Цитата Сообщение от StackOverflow Посмотреть сообщение
Как тогда будет выглядеть прототип некой функции someFunction, которая принимала бы в качестве аргумента этот массив?
Можно по ссылке передать:
C++
1
void someFunction(int (&array)[rowSize][columnSize])
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 09:33  [ТС]
А вызов будет выглядеть так?
C++
1
someFunction( example );
..и как будет выглядеть прототип?
У одномерного массива нужно было обязателно передавать его размер, почему же в случае с двумерным массивом ето правило не работает?
Спасибо, что так быстро откликнулись)
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
03.08.2013, 09:47
Цитата Сообщение от StackOverflow Посмотреть сообщение
У одномерного массива нужно было обязателно передавать его размер, почему же в случае с двумерным массивом ето правило не работает?
Да те же самые правила...
Массив по значению передать нельзя, либо в виде ссылки, либо в виде указателя (здесь надо отдельно передавать размер)
Ссылка:
C++
1
void function(int (&array)[size])
Указатель + размер:
C++
1
void function(int * array, std::size_t size)
Цитата Сообщение от StackOverflow Посмотреть сообщение
А вызов будет выглядеть так?
someFunction( example );
да
1
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
03.08.2013, 09:48
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    const int rowSize = 5;
    const int columnSize = 7;
 
void someFunction(int m[][columnSize])
{
    for(int i=0;i<rowSize;i++)
    {
        for(int j=0;j<columnSize;j++)
        {
        }
    }
}
void main()
{
    int example[ rowSize ][ columnSize ];
    someFunction(example);
}
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.08.2013, 09:50
масса вариантов:
int a[M][N];

void F(int a[M][N], int m, int n)
void F(int a[][N], int m, int n)
void F(int (*a)[N], int m, int n)
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 10:04  [ТС]
А почему число строк можно не указывать?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.08.2013, 10:37
Передавать сам массив по ссылке, а размеры массива сделать шаблонными параметрами:
C++
1
2
template <class T, size_t N, size_t M>
void func(T (&arr)[N][M])
Естественно, что работать будет только со статическими массивами.
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 19:20  [ТС]
Поправьте пожалуйста, если я в чём-то ошибаюсь.

Указатель - это ячейка в памяти, которая после инициализации хранит адрес другой ячейки в памяти, хранящей некоторое значение.
После применения к указателю операции разыменования, мы фактически попадаем в ту ячейку, хранящую значение.
Ссылка - это альтернативное имя для переменной, к которой привязана ссылка.
Тогда имя массива - это указатель на первый элемент в массиве, который хранит адрес этого первого элемента.
Допустим:
C++
1
2
3
4
5
6
7
8
9
10
11
int array1[ 10 ] = { 0 }; //array1 ни что иное, как &array1[ 0 ]
//тогда
int * arrayPtr = array1; //arrayPtr теперь хранит тот же адрес первого элементы &array1[ 0 ]
//а если
int * arrayPtr1 = &arrayPtr; //то arrayPtr1 будет хранить адрес, по которому расположен указатель arrayPtr
//далее
cout << array1[ 0 ] << *arrayPtr << arrayPtr[ 0 ] << *array1 << endl; //выведет 0 во всех случаях
cout << arrayPtr << array1 << endl; // выведет адрес, по которому расположен первый элемент в массиве
cout << arrayPtr1 << endl; // выведет адрес, по которому расположен указатель arrayPtr
cout << *arrayPtr1 << endl; // выведет то, что находится по адресу указателя arrayPtr, а именно адрес первого элемента в массиве
cout << *( *arrayPtr1 ) << endl; // выведет значение первого элемента в массиве
Тогда почему, если мне нужно передать arrayPtr, то нужно в функции специфицировать, что в качестве аргумента поступит указатель, а когда я просто передаю имя массива array1, то ничего специфицировать не нужно? Помогите, пожалуйста, разобраться в этих тонкостях. И ещё, совпадает ли адрес array1 и адрес первого элемента в массиве?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
05.08.2013, 19:32
Цитата Сообщение от StackOverflow Посмотреть сообщение
Тогда имя массива - это указатель на первый элемент в массиве, который хранит адрес этого первого элемента.
Имя массива почти во всех контекстах неявно приводится к указателю на первый элемент.

Добавлено через 2 минуты
Но не при sizeof, например:
C++
1
2
3
4
5
int array[10];
int * arrayPtr = array;
 
std::cout << "sizeof (array) = " << sizeof (array) << std::endl;
std::cout << "sizeof (arrayPtr) = " << sizeof (arrayPtr) << std::endl;
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:20  [ТС]
gray_fox, большое Вам спасибо, что помогаете. Хочу всё таки уточнить разницу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void print( const int * [], const int );
 
int main()
{
    int array[ 10 ] = { 0 };
    int * arrayPtr = array;
 
    print( array, 10 );
    print( arrayPtr, 10 );
 
    return 0;
}
 
void print( const int * arrayToPrint[], const int size )
{
// тело функции
}
выдаст ошибку?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
05.08.2013, 20:26
StackOverflow, если имелось ввиду
C++
1
void print( const int *, const int )
то нет, всё в порядке.

Добавлено через 2 минуты

Не по теме:

P.S.: "внешний" const параметра ф-ии не влияет на её сигнатуру, т.е. можно так:

C++
1
2
3
4
5
void print( const int *,  int );
 
// ...
 
void print( const int * const arrayToPrint, const int size )

0
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:31  [ТС]
Ах, вот, кажется заметил наконец, в чём разница!) Если поставить квадратные скобочки, то это уже будет своего рода разыменованием, да? А если вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
//то же самое только подправлю чуть-чуть прототип
void print( const int [], const int );
 
int main()
{
//................
print( array, 10 );
print( arrayPtr, 10 );
 
return 0;
}
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
05.08.2013, 20:33
Цитата Сообщение от StackOverflow Посмотреть сообщение
C++
1
void print( const int [], const int );
Ну вообще это тоже самое, что и
C++
1
void print( const int *const, const int );
Добавлено через 49 секунд
Т.е. тип первого аргумента - константный указатель.
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:38  [ТС]
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
05.08.2013, 20:44
Цитата Сообщение от StackOverflow Посмотреть сообщение
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
Если в прототипе скобочки или звёздочка, в любом случае передаете указатель, только в случае
C++
1
print(array, 10);
будет иметь место преобразование array (имя массива) к указателю на первый элемент этого массива, т.е. тоже самое:
C++
1
print(&array[0], 10);
Добавлено через 2 минуты
Цитата Сообщение от StackOverflow Посмотреть сообщение
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
Ну, т.е. да, можно)
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:47  [ТС]
gray_fox, большое Вам спасибо, Вы мне очень помогли!
P.S. Можно по какому-либо вопросу обращаться к Вам за помощью прямо в ЛС?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
05.08.2013, 20:48
StackOverflow, лучше тему создавайте, разные люди подскажут...
0
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
06.08.2013, 13:54  [ТС]
А как можно было бы передать двумерный массив через конструктор класса или через set-функцию класса?
Допустим ли такой вариант:
C++
1
2
3
4
5
6
7
8
int main()
//...
int row = 4;
int column = 2;
double array[ row ][ column ] = { { 0 } };
double * arrayPtr = array;
//...
Example object( arrayPtr, row, column );
И если размерность массива, которую хранит объект, звисит от входных данных, как быть?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.08.2013, 14:03
StackOverflow, даже если бы можно было создать двумерный массив с размерами, заданными переменными (не константами), то в 7 строке - несовместимость типов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2013, 14:03
Помогаю со студенческими работами здесь

Передача статического двумерного массива, как параметра
Не компилируется, пишет что не может открыть файл #include &lt;iostream&gt; #include &lt;conio.h&gt; #include&lt;cstdlib&gt; using...

Передача двумерного статического/автоматического массива в функцию
прототип void func(int **data, size_t n, size_t m);. Динамический передаётся int main () { int **a; size_t n; size_t m; ...

Передача двумерного массива в функции
Здравствуйте. В c++ недавно. Компилятор ругается. Как правильно передать двумерный массив в функции? И вообще, какие замечания по коду? ...

Передача двумерного массива в функции
Мне нужно передать массив в функцию, а затем из этой функции в другую функцию. Вот код: #define _CRT_SECURE_NO_WARNINGS #define...

Передача двумерного массива из функции в функцию
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; const int n=10; void func_1(); int func_2(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru