Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 103, средняя оценка - 4.77
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
#1

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

17.04.2009, 21:24. Просмотров 14516. Ответов 12
Метки нет (Все метки)

Я сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
void PrintMatrix(int** matrix, int& n, int& m) {
    for (int i = 0; i < n; i++) {
        cout << "Row " << (i + 1) << ": ";
        for (int j = 0; j < m; j++) {
             cout << "\t" << matrix[i][j];
        }
        cout << "\n";
    }
    cout << "\n";
}
Это правильный вариант?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2009, 21:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача динамического двумерного массива в функцию (C++):

Передача по ссылке двумерного динамического массива в функцию - C++
Приведите, пожалуйста, пример. Нигде не могу найти.

Передача двумерного динамического массива в функцию(объяснение) - C++
Когда мы хотим передать двумерный динамический массив в функцию через указатели (**a) , то в теле ф-ии main() , мы пишем так , как указано...

Передача двумерного динамического массива чисел в функцию - C++
void Map::setCell(int** block, Room* room, int type){ for(int i=room-&gt;x; i&lt;room-&gt;w; ++i) for(int j=room-&gt;y; j&lt;room-&gt;h; ++j) ...

Передача двумерного динамического массива в функцию построчно и сортировка - C++
Всем доброго времени суток! Собственно сабж: есть двумерный динамический массив, который надо делить на одномерные и передавать в функцию...

Передача двумерного динамического массива в функцию в качестве параметра - C++
Вообщем надо сложить и умножить две матрицы, но сделать это в отдельных функциях. Матрицы заданы динамическими массивами размерами n*m и...

Передача динамического двумерного массива в процедуру - C++
Написал вот такой код для одномерного динамического массива #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; ...

12
Mecid
680 / 229 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
17.04.2009, 21:27 #2
да,но размер не обязательно по ссылке передавать
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
17.04.2009, 21:29 #3
Код
void PrintMatrix(int** matrix, int& n, int& m)
исправь на
Код
void PrintMatrix(int** matrix, int *n, int *m)
0
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 21:32  [ТС] #4
А в чем разница?
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.04.2009, 21:32 #5
Gravity, вот исправь и проверь. Если ты меняешь на указатели, то весь вызов и функцию прийдется переписывать.

rar14, рациональней наверное будет сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void PrintMatrix(int** matrix, int n, int m) 
{
   for (int i = 0; i < n; i++) 
   {
        cout << "Row " << (i + 1) << ": ";
        for (int j = 0; j < m; j++) 
        {
             cout << "\t" << matrix[i][j];
        }
        cout << "\n";
    }
    cout << "\n";
}
0
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 21:40  [ТС] #6
А можно теоретически объяснить, почему лучше передавать m и n как указатели, а не как ссылки? Или, почему лучше передавать локальными параметрами? а не по ссылке?
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
17.04.2009, 21:45 #7
Monte-Cristo, уже заметил, смутило взятие адреса в параметрах.

rar14, если ты не собираешься присваивать новые значения существующим m и n, то передавай их в функцию по значению, в обратном случае по ссылке.
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.04.2009, 21:48 #8
существует три вида передачи параметров в функцию:
1. по значению
2. по указателю
3. по ссылке

по значению, создается локальная компия передаваеммой переменной. После того как функция завершается, копия уничтожается.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
void func1(int x) // передача по значению
{
    x = 1;
}
 
void func2(int& x) // перадча по ссылке
{
    x = 2;
}
 
void func3(int* x) // передача по указателю
{
    *x = 3;
}
 
int main()
{
    int a = 0;
 
    func1(a);
    cout << a << endl;
 
    func2(a);
    cout << a << endl;
 
    func3(&a);
    cout << a << endl;
 
    return 0;
}
0
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 22:02  [ТС] #9
Спасибо большое! Только вот такой вопрос по примеру. А чем отличается, в данном случае, передача по ссылки от передачи по указателю?

И еще. using namespace std - зачем это нужно?

Спасибо.
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.04.2009, 22:20 #10
ссылка - это посути псевдоним. Ты работаешь с перменной в функции, как с обычной перменной. ссылки реализованы в с++, в си их не было.

указатель - это такая перменная, которая указывает на некую область памяти:
C++
1
func3(&a);
сдесь перед переменной стоит & он означает взяти адреса. т.е. в функцию передается адрес переменной. А чтобы манипулировать со значением, приходится ставить оператор разыменования *. т.е. внутри функции ты работаешь со значением так


Цитата Сообщение от rar14 Посмотреть сообщение
using namespace std
это пространство имен. что это такое я объснить не могу. слишком долго. почитай на в книгах, или в статьях)
0
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 22:23  [ТС] #11
Ну, using namespace std обязателен? Лучше с ним?

Спасибо.
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.04.2009, 22:31 #12
C++
1
2
#include <iostream>
using namespace std;
вот такая вот запись обеспечит успешную компиляцию на большинстве компиляторах. теоретически можно и так
C++
1
#include <iostream.h>
но, в Visual C++ 2008
написанное выше не проходит... потому-что объекты cin и сout находятся в пространстве имен std, и тогда бы пришлось писть
std::cin и std::cout
0
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 22:38  [ТС] #13
Спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2009, 22:38
Привет! Вот еще темы с ответами:

Передача динамического двумерного массива через параметры - C++
в такой вот простенькой программке: #include .. const n = 4; void ENTR(double pMas, char *file) { ifstream SMas(file); ...

Вывод динамического двумерного массива через функцию - C++
Имею следующий код: void matrix_output (int **matrix, int N) { for (int i=0; i&lt;N; i++) { for...

Передача динамического массива в функцию - C++
Нужно передать динамический массив в функцию, описав как ссылку (&amp;p). Но я не понимаю, как к нему обращаться в функции.

Передача динамического массива в функцию - C++
Скажите пожалуйста, почему при передаче динамического массива в функцию, адрес локальной переменной (b) отличается от адреса исходной...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
17.04.2009, 22:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru