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

Malloc. Двумерные массивы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.62
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 227
13.10.2012, 17:16     Malloc. Двумерные массивы #1
Всем привет.
Выделяем динамическую память.


1) int *M=(int*)malloc(sizeof(int)*N*N)

2) int **M=(int **)malloc(N*sizeof(int*)
for (int i=0; i<N; i++)
M[i] = (int*) malloc (N*sizeof(int)


Правила чтения этой вышенаписанной ерунды? Как это читается? и где можно подробно про это почитать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2012, 17:16     Malloc. Двумерные массивы
Посмотрите здесь:

C++ двумерные массивы
C++ Двумерные массивы
Двумерные массивы C++
C++ Двумерные массивы
Целочисленная арифметика ,Одномерные массивы ,Двумерные массивы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.10.2012, 19:32     Malloc. Двумерные массивы #2
1. Выделяем кусок памяти, достаточный для размещения N2 интов. Указатель на его начало сохраняем в M. Это можно понимать как одномерный массив из N2 элементов (доступ по M[i]), так и как двумерный из N × N (доступ по M[N*i + j])

2. Выделяем кусок памяти, достаточный для размещения N указателей. Потом выделяем N кусков памяти, достаточных для размещения по N интов в каждом. Сохраняем их в первом массиве. Указатель на начало массива указателей на массивы сохраняется в M. Эту штуку можно использовать как массив N × N с помощью M[i][j].
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,283
Завершенные тесты: 1
13.10.2012, 19:32     Malloc. Двумерные массивы #3
Если i - строка, j-столбец
В первом случае:
C
1
a=M[i*N+j]
Во втором полностью идентично статическим массивам:
C
1
a=M[i][j]
OhMyGodSoLong
13.10.2012, 19:39
  #4

Не по теме:

Цитата Сообщение от alexcoder Посмотреть сообщение
Во втором полностью идентично статическим массивам
Синтаксически идентично. Если смотреть в памяти, то многомерные массивы размещаются в одном сплошном куске и адресуются через кучку сдвигов.

MLPMan
Кандёхаем веселее!
 Аватар для MLPMan
280 / 275 / 34
Регистрация: 02.10.2012
Сообщений: 1,931
13.10.2012, 20:53     Malloc. Двумерные массивы #5
Мне в C++ удобнее использовать "new", так текст менее навороченый, легче читать.
Например, создание матрицы 10x10, эквивалентно коду 2 :
C++
1
2
3
4
int N, i;
N=10;
int** M = new int*[N]; //Выделяем память для M - массива из 10 массивов
for (i=0; i<N; i++) M[i] = new int[N]; //Выделяем память для каждого "подмассива"
iKapex
3 / 3 / 0
Регистрация: 07.10.2012
Сообщений: 227
13.10.2012, 22:09  [ТС]     Malloc. Двумерные массивы #6
Спасибо за ответы.

Но я даже не понимаю как работает доступ M[N*i+j]. М(как я понимаю имя массива). Допустим, число элементов N=10, нам надо получить значение ячейки М[5][3]. Тогда M[10*5+3] равно 53. Что значит эта цифра?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 00:38     Malloc. Двумерные массивы
Еще ссылки по теме:

C++ Двумерные массивы(массивы указателей на массивы)
C++ Двумерные массивы
двумерные массивы C++

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 00:38     Malloc. Двумерные массивы #7
Это индекс в большоооом одномерном массиве. На самом деле™ двумерные массивы представляются как одномерные. Первые 10 элементов — это M[0][...], вторые 10 — это M[1][...] и т. д.

Но это касается статически создаваемых. И когда такая адресация делается руками. Если делать malloc, а потом ещё malloc в цикле, то немного не так.
Yandex
Объявления
14.10.2012, 00:38     Malloc. Двумерные массивы
Ответ Создать тему
Опции темы

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