русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Метод Айлиффа


Дата добавления: 2015-01-16; просмотров: 1002; Нарушение авторских прав


Метод Айлиффа доступа к элементам массива пригоден для работы, как с прямоугольными, так и непря­мо­угольными массивами. В некоторых случаях он может оказаться более быстродействующим, так как не использует операций умножения, однако метод требует дополнительной памяти. В качестве примера рассмотрим представление двумерного массива, в котором длина i-й строки равна i+1, как это представлено на рис 4. Выделение памяти для такого массива выглядит следующим образом:

 

// выделим память для массива из 4-х указателей на строки

double **a=new double *[4];

// выделим память для каждой строки

for(int i=0; i<4; i++){

a[i]=new double[i+1];

}

 

Теперь имеем право обращаться к элементам массива как обычно: a[i][j]

Заметим, что запись a[i][j] эквивалентна записи *(*(a+i)+j), что в действительности и происходит при обращении к элементу массива a[i][j]:

- в переменной анаходится адрес начала массива указателей на строки.

- прибавив к нему i, получим адрес a+i указателя на i-ю строку

- извлечем из него адрес начала i-й строки: *(a+i)

- прибавим к нему j и получим адрес j-го элемента i-й строки: *(a+i)+j

- и, наконец, извлекаем по этому адресу значение элемента массива: *(*(a+i)+j)

Как видно, операция умножения действительно не используется. Поскольку память для массива была взята из кучи, то впоследствии ее необходимо освободить. Освобождение выполняется в порядке обратном выделению:

for(int i=0; i<4; i++){

delete [] a[i];

}

delete a;

Контрольные вопросы

1) Каким образом вычисляется адрес элемента многомерного массива по его индексам?

2) Вычислите адрес элемента массива A[4][3][2], если его описание имеет вид int A[2:5][1:7][0:3];(здесь предполагается, что нижние границы изменения индекса могут быть заданы).

3) Напишите текст фрагмента программы, создающей непрямоугольный массив из 10 строк, в котором четные строки имеют по 5 элементов, а нечетные по 8 элементов.





<== предыдущая лекция | следующая лекция ==>
Размещение прямоугольных массивов в последовательной памяти | Операции над односвязным списком


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.2 сек.