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

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

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

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

17.04.2009, 21:24. Просмотров 13436. Ответов 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";
}
Это правильный вариант?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2009, 21:24     Передача динамического двумерного массива в функцию
Посмотрите здесь:

Передача динамического двумерного массива через параметры C++
C++ Передача динамического массива в функцию
Вывод динамического двумерного массива через функцию C++
C++ Передача двумерного динамического массива чисел в функцию
Передача динамического массива в функцию C++
C++ Передача двумерного динамического массива в функцию построчно и сортировка
Передача динамического массива в функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mecid
678 / 227 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
17.04.2009, 21:27     Передача динамического двумерного массива в функцию #2
да,но размер не обязательно по ссылке передавать
Gravity
557 / 551 / 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)
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 21:32  [ТС]     Передача динамического двумерного массива в функцию #4
А в чем разница?
Monte-Cristo
2786 / 1372 / 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";
}
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 21:40  [ТС]     Передача динамического двумерного массива в функцию #6
А можно теоретически объяснить, почему лучше передавать m и n как указатели, а не как ссылки? Или, почему лучше передавать локальными параметрами? а не по ссылке?
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
17.04.2009, 21:45     Передача динамического двумерного массива в функцию #7
Monte-Cristo, уже заметил, смутило взятие адреса в параметрах.

rar14, если ты не собираешься присваивать новые значения существующим m и n, то передавай их в функцию по значению, в обратном случае по ссылке.
Monte-Cristo
2786 / 1372 / 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;
}
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 22:02  [ТС]     Передача динамического двумерного массива в функцию #9
Спасибо большое! Только вот такой вопрос по примеру. А чем отличается, в данном случае, передача по ссылки от передачи по указателю?

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

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

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


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

Спасибо.
Monte-Cristo
2786 / 1372 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2009, 22:38     Передача динамического двумерного массива в функцию
Еще ссылки по теме:

Передача динамического массива в функцию C++
C++ Передача двумерного динамического массива в функцию(объяснение)
Передача двумерного динамического массива в функцию в качестве параметра C++
Передача по ссылке двумерного динамического массива в функцию C++
C++ Передача динамического двумерного массива в процедуру

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

Или воспользуйтесь поиском по форуму:
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
17.04.2009, 22:38  [ТС]     Передача динамического двумерного массива в функцию #13
Спасибо.
Yandex
Объявления
17.04.2009, 22:38     Передача динамического двумерного массива в функцию
Ответ Создать тему
Опции темы

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