Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2009, 14:45   #11
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Я просто припоминаю, что давно как-то так делал: выделял одномерный массив x*y, а потом использовал указатель двумерного массива на том же куске памяти. Только, кажется, одна размерность была постоянной.

Вариант mYziK-а и правда понятнее. И еще в нем можно делать строки разной длины. А я выделяю x*y байт и работаю с ними как захочется - например, обращаясь к элементу a[i,j] так: a[i+j*x]. Можно наоборот: a[i*y+j] - главное сразу определиться и не путать. Если в программе много раз выделяется/освобождается память, то такой вариант предпочтительнее по скорости (оператор new относительно медленный).

Последний раз редактировалось ds.Dante; 06.10.2009 в 18:24.
ds.Dante вне форума Ответить с цитированием
Старый 06.10.2009, 17:52   #12
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
Хорошо

Спасибо, постараюсь разобраться.

Ааа, все, понятно! У тебя какбы... псевдоматрица? Ну, на самом деле это одномерный массив.) Просто обращаешься ты к нему... хм, по хитрому =)
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.

Последний раз редактировалось forsaken66; 06.10.2009 в 17:57.
forsaken66 вне форума Ответить с цитированием
Старый 07.10.2009, 15:44   #13
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
Смех

Цитата:
.....если честно, то я не могу понять этот код. В объяснение Myzik'a въехал, а тут... нельзя ли объяснить?
Цитата:
char *a1 = new char[x*y];
char **a2 = a1
...
cout << a2[i][j];



P. S. Так не получается... но можно так:

char *a1 = new char[x*y];
...
cout << a2[i+j*y];

Так, кстати, быстрее.
Согласен, что-то первым тот способ пришел в голову как более наглядный

Объяснение:

динамический массив - это последовательный блок памяти:
[int0][int1][int2][int3][int4]...[inti]...

Имя массива - указатель на нулевой [int0], то, что пишешь в "[]" - это смещение относительно нулевого элемента, т.е. запись a[i] равносильна записи *(a+i) //Элемент по адресу a+i, т.е. [inti]

Кстати по-этому можно писать i[a] =) т.к. это все равно *(i+a)

Мой вариант матрицы:

[int*0][int*1][int*2]....[int*i]

т.е. массив указателей на другие массивы, которые так же последовательно расположенны в памяти(ток я не помню/не знаю, один за одним ли...):

[int00][int01][int02]...[int0i].....[int10][int11][int12]...[int1i]... и т.д.

ds.Dante Сразу выделяет блок памяти размером x*y, что будет равносильно одномерному массиву размером x*y, но его можно использовать и как двумерный массив (матрицу), просто обращаясь
Код:
a2[i+j*y];
(т.е. *(a2+i+j*y) - элемент в a2+j*y - блоке со смещением "i"...

j*y - это на сколько ячеек (а блоки у нас по y - элементов, нужный блок - j) нужно сместиться от самого первого, чтобы попасть в j-ый столбец (или строку - смотря как интерпретировать x и y). так запись a2[i*x+j] - элемент в i-ой строке j-го столбца...

З.Ы. Может немного напутал с столбец-строка, сори заранее, не спал ночь


З.Ы.Ы. - Вечно забываю про вторую страницу - не увидел ваших постов А удалять уже жалко =)
mYziK вне форума Ответить с цитированием
Старый 07.10.2009, 16:54   #14
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
Хорошо

Спасибо, я всё понял.
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 15.10.2009, 23:17   #15
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

А у меня такой вопрос, если мне нужно будет определить и вывести на экран адрес элемента матрицы(многомерного динамического массива), то как мне это сделать??
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 15.10.2009, 23:36   #16
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Arcueid1691
Код:
int **a;
...
printf("%p", &a[7][3]);
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 15.10.2009, 23:44   #17
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Greblin Посмотреть сообщение
Код:
int **a;
...
printf("%p", &a[7][3]);
в этом случае получаем адрес элемента, так?
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 16.10.2009, 00:09   #18
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Цитата:
Сообщение от Arcueid1691 Посмотреть сообщение
в этом случае получаем адрес элемента, так?
АгаНу написал же, зачем ещё спрашивать. А на меня форум бухтит, что сообщение короткое
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.10.2009, 00:11   #19
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

а возможно ли получить индекс элемента матрицы? Т.е. а[i][j]
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 16.10.2009, 00:17   #20
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Если массив объявлен как int a[M][N], то можно, используя, что в этом случае все элементы будут располагаться подряд, сначала N элементов 1ой строки, потом N элементов 2ой строки и т.д. А вот если объявлять как int **a, и дальше выделять память, то нельзя.
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
Вопрос про массивы и модули ? juan666777 Общие вопросы Delphi 6 21.07.2009 22:43
Stringgrid, cells[m,n] и двумерные массивы.(#002) Очередной вопрос начинающего. Albert2008 Компоненты Delphi 4 28.07.2008 19:02
Вопрос массивы и циклы probmat Помощь студентам 7 16.03.2008 13:35