Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как представляются двумерные массивы в памяти СИ?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как представляются двумерные массивы в памяти СИ? Как, к примеру, посредством указателей получить доступ к элементу i,j?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 17:47 31-01-2003
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kak i v bolshinstve drugih yazykov.
 
int A[M][N]
 
togda element i,j est' A[i][j]   libo  A[i+j*M] esli ukazatel to smeschenie est' (i+j*M)  (nu i essno *Size(element)  hotya dlya C i ne aktual'no )
 
Добавлено
Kstati imenno poetomu tsykly lucshe pisat' v vide
 
for (j...)
  for (i...)
    .....
 
 a ne
for (i....)
  for (j...)
     .....
 
V pervom sluchae bolee effektivnoe ispolzovanie cache.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 19:41 31-01-2003
Zepplock



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zam

Цитата:
Как представляются двумерные массивы в памяти СИ? Как, к примеру, посредством указателей получить доступ к элементу i,j?

 
Как ты захочешь - так и представляй. В том и красота С.
 
Либо как пример выше.
Либо массив ссылок на элементы.
Либо как массив ссылок на ссылки.
 


----------
-=[+ Led Zeppelin Forever +]=- - -=[+ Vova.Org - Make Love Not War +]=-

Всего записей: 347 | Зарегистр. 25-10-2001 | Отправлено: 07:48 01-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
А как через указатели ты получишь значение элемента i,j? И как, иллюстративно все-таки двумерный массив представляется в памяти?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 10:01 01-02-2003
Octane

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Массив это сложный тип данных состоящий из однородных элементов любого типа(кроме ФАЙЛА) соответственно двумерный массив чего-нибудь это массив массивов чего-нибудь...  
 
A[n][m]
 
в памяти это будет отрезок состоящий из n элементов каждый из которых состоит из m элементов
 
что тут сложного ?

Всего записей: 130 | Зарегистр. 30-11-2002 | Отправлено: 14:49 01-02-2003
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 И как, иллюстративно все-таки двумерный массив представляется в памяти?  

 
Двумерный массив разворачивается линейно в памяти (как в общем-то и n-мерный). То есть.
 
| 1 2 3 |
| 4 5 6 | =A[i][j]   i-номер столбика, j-номер строки
| 7 8 9 |
 
В памяти лежит как:  [1 2 3 4 5 6 7 8 9]  следовательно любой эл-т массива может быть доступен как A[i][j]  либо как A[i+j*Кол-во столбиков]. Теперь с указателями...как ты получаешь доступ к эл-ту одномерного массива с индексом i ? Точно так же ты получашь доступ к эл-ту двумерного массива, только индекс будет не i, а i+j*M.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 16:52 01-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
int a[M][N] -- M-элементов в каждой из N-строк,
адрес i,j-элемента (по-моему):
 
&a[i][j] = j*M + i; -- ничего не забыл?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 10:11 02-02-2003
PKZip



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
int a[M][N] -- M-элементов в каждой из N-строк,

 
Точнее сказать M элементов, каждый из которых содержит N элементов. А строки, столбцы и т.д. - это абстракции для удобства восприятия, их можно обзывать, к примеру: "полочка", "шкафчик" и т.д.
 

Цитата:
&a[i][j] = j*M + i

 
абсолютно не правильно правильно так:
 
&a[i][j] = a + i*N + j;

Всего записей: 17 | Зарегистр. 10-04-2002 | Отправлено: 11:08 02-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
PKZip
у тебя - M - строка, N - столбец как у меня? i - элемент строки, j - элемент столбца???
Получается N элементов (столбцов) по M элементов (строк)? Так ведь!

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 16:04 02-02-2003
PKZip



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zam
как я уже говорил, в принципе все равно что считать строкой, а что столбцом. но в С принято считать, что если есть a[M][N], то это M элементов, каждый из которых содержит по N элементов. это связано с тем, как располагаются эти элементы в памяти, а именно: сначала идут первые N элементов (т.е. первый M элемент), потом вторые и т.д.

Всего записей: 17 | Зарегистр. 10-04-2002 | Отправлено: 16:22 02-02-2003
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
М-дя...зря я про строки начал в обчем what pkzip said...

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 18:33 02-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
int a[M][N];
&a[i][j] == (int *)a + i*N + j;
 
что есть (int *)a?
 
--
Свою ошибку я понял - перепутал строки со столбцами (что идет первым) при инициализации.

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 10:08 07-02-2003
PKZip



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zam
 
(int *)a - есть получение адреса массива 'a' и приведение его к указателю типа (int *), в данном случае, наверно, можно и без (int *) писать:
 
&a[i][j] == a + i*N + j;

Всего записей: 17 | Зарегистр. 10-04-2002 | Отправлено: 11:23 08-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
PKZip
т.е. адрес первого элемента?

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 12:15 08-02-2003
PKZip



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zam

Цитата:
т.е. адрес первого элемента?  

 
совершенно верно

Всего записей: 17 | Зарегистр. 10-04-2002 | Отправлено: 15:09 08-02-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как представляются двумерные массивы в памяти СИ?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru