16838

Массивы и многоуровневая косвенная адресация

Лекция

Информатика, кибернетика и программирование

Лекция 10 5. Массивы и многоуровневая косвенная адресация Многоуровневая косвенная адресация и одномерные арифметические массивы Многоуровневая адресация имеет место при использовании указателей на указатели на массивы. Рассмотрим это на примерах формирования одн

Русский

2013-06-26

564 KB

1 чел.

Лекция 10

5. Массивы и многоуровневая косвенная адресация

Многоуровневая косвенная адресация и одномерные арифметические массивы

Многоуровневая адресация имеет место при использовании указателей на указатели на массивы. Рассмотрим это на примерах формирования одномерного динамического массива данных типа byte. Для простоты количество элементов массивов задается константами.

В листинге 17 приведена программа формирования одномерного динамического массива данных. В ней используются:

N - имя константы - количества элементов массива;

ta - имя типа - массива на 100 элементов;

pta - имя типа - указателя на массив типа ta;

А - имя переменной - указателя на массив типа ta;

i - переменная типа byte - номер элемента массива;

рА - переменная типа указатель на тип byte.

Динамический массив А^ заполняется значениями i - номеров его элементов с использованием одноуровневой косвенной адресации. После заполнения массива производится вывод его значений. При выполнении программы в окно просмотра можно вывести:

@А - адрес указателя на массив;

А - значение указателя на массив;

А^ - значения элементов динамического массива;

@А^ [i],   рА - адрес i-элемента массива;

А^[i] ,  рА^ - значение i-элемента массива.

Листинг 17. Формирование одномерного динамического массива данных типа byte. Используется указатель на массив.

Uses  Crt;

Const N = 3; { - количество элементов массива }

type {   Имена типов: }

ta = array[1..100] of byte;{ - массив данных типа byte }

pta = ^ta; { - указатель на тип ta     }

var A :  pta; { - переменная - указатель на массив }

i :  byte;

рА : ^byte; { - указатель на значение типа byte  }

Begin ClrScr;

GetMem(A,N*SizeOf (byte));{-запрос ОП для элементов А^}

{ - динамического массива    } For i := 1 To N Do begin

А^[i]:=i;    { - обращение к элементу массива А }
рА := @ А^[
i ]; { - указатель на элемент массива А }

Writeln ( 'А^[', i,'] = ', A^[i], ' ', 'рА^ = ', рА^);

end;

FreeMem(A,N*SizeOf(byte)); {- освобождение ОП А^ }

А := Nil;{   -   обнуление  указателя   }

End.

Рис.7

Схема взаимосвязи указателя, адресов и значений одномерного динамического массива. Используется А - указатель на массив типа ta

На рис. 7 представлена схема взаимосвязи указателя А, адресов и значений одномерного динамического массива программы листинга 17.

В листинге 18 приведена программа для формирования одномерного динамического массива данных с применением скалярного указателя на указатель на массив. В ней используются:

N, ta, pta, i, pA - того же назначения, что и в листинге 17;

ppta - имя типа - указателя на тип pta: указателя на указатель на массив типа ta;

А - имя переменной - указателя на указатель на массив типа ta.

Действия программы аналогичны действиям программы листинга 17. Заполнение массива значениями производится с использованием двух уровней косвенной адресации. При выполнении программы в окно просмотра можно вывести:

@А - адрес указателя на указатель на массив;

А - значение указателя на указатель на массив;

А^ - значение указателя на динамический массив;

А^^ - значения элементов динамического массива;

@А^^ [i] ,   рА - адрес i-элемента массива;

А^^[i],  рА^ - значение i-элемента массива.

На рис.8 представлена схема взаимосвязи указателя А, адресов и значений одномерного динамического массива программы листинга 18.

Рис. 8

Схема взаимосвязи указателей, адресов и значений одномерного динамического массива. Используется А - указатель на указатель на массив типа ta

Листинг 18. Формирование одномерного динамического массива данных типа byte. Используется указатель на указатель на массив.

Uses Crt;

Const N = 3; { - количество элементов массива }

type { Имена типов: }

ta = array[1..100] of byre; {- массив данных типа byte}

pta = ^ta; { - указатель на массив ta }

ppta = ^pta; { - указатель на указатель на массив ta }

var A:ppta;{- переменная - указатель на указатель на массив }

i, j : byte;

рА : ^byte; { - указатель на значение типа byte }

Begin   ClrScr;

New (A);  { - запрос ОП для А^ - указателя на массив }

{ Запрос ОП для А^^ - элементов динамического массива: } GetMem (А^,  N * SizeOf ( byte ));

For i := 1 To N Do    begin

А^^[i] := i ; { - обращение к элементу массива }
рА := @А^^[
i]; { - указатель на элемент массива А }

Writeln ('А^^[',i,'] = ', A^^[i], 'pA^ = ', рА^ );

end;

FreeMem(A^,N*SizeOf (byte));{- освобождение ОП А^^}

Dispose (A); А:=nil;{- освобождение ОП А^}

End.

Многоуровневая косвенная адресация и многомерные арифметические массивы

В листинге 19 приведена программа для формирования двумерного динамического массива данных. В ней используются:

М - количество строк массива;

N - количество столбцов массива;

ta - имя типа - двумерного массива на 100 строк и N столбцов;

pta - имя типа - указателя на массив типа ta;

рА - переменная типа указатель на тип byte;

А - переменная типа указатель   на тип pta - указатель на массив типа

ta;

i - переменная типа byte - номер строки массива;

j - переменная типа byte - номер столбца массива.

Динамический массив А^ заполняется значениями i+j с помощью одноуровневой косвенной адресации. После формирования значений элементов массива производится их вывод. Во время выполнения программы в окно просмотра можно вывести:

@А - адрес указателя на массив;

А - значение указателя на массив;

А^ - значения элементов динамического массива;

A^[i] - значения элементов i-строки динамического массива;

@А^ [ i, j ], рА - адрес элемента массива;

А^[i, j], рА^ - значение элемента массива.

Листинг 19. Формирование двумерного динамического массива данных типа byte. Используется указатель на двумерный массив.

Const М=2; N=2; {- количество строк и столбцов массива}

type {   Имена  типов:    }

ta = array[1..100, 1..N] of byte; {- массив данных  типа byte}

pta =  ^  ta; {   - указатель  на  тип ta }

var A : pta; { - переменная - указатель на массив }

i, j : byte;

pA : ^bytе;{ - указатель на значение типа byte }

Begin

GetMem (A, M*N*SizeOf (byte)); {- запрос ОП для А^}
For i := 1 To M Do {   динамического массива   }

For j := 1 To N Do  begin

A^[i,j] := i+j; {- обращение к элементу массива А^ }

рА := @А^ [i,j];{- указатель на элемент массива А^ }

Writeln ('А^[',i,',',j,'] = ',AA[i,j],' рА^=', рА^);

end;

FreeMem(A,M*N*SizeOf (byte)); { - освобождение ОП А^}

A := Nil;

End.

На рис. 9 представлена схема взаимосвязи указателя А, адресов и значений двумерного динамического массива программы листинга 19.

Рис. 9

Схема взаимосвязи указателей, адресов и значений двумерного динамического массива. Используется А - указатель на двумерный массив типа ta

В листинге 20 приведена программа для формирования двумерного динамического массива данных с использованием скалярного указателя на указатель на массив. В ней используются:

M, N, ta, pta, i, j, pA - того же назначения, что и в листинге 19;

ppta - имя типа - указателя на тип pta: указателя на указатель на массив типа ta;

А - имя переменной - указателя на указатель на массив типа ta.

Действия программы аналогичны действиям программы листинга 19. Заполнение массива значениями производится с использованием двух уровней косвенной адресации. При выполнении программы в окно просмотра можно вывести:

@А - адрес указателя на указатель на массив типа ta;

А - значение указателя на указатель на массив типа ta;

А^ - значение указателя на динамический массив;

А^^  - значения элементов динамического массива;

А^^[i] - значения элементов i-строки;

@А^^ [ i, j ], рА - адрес А[ i,j ] - элемента массива;

А^^[i, j ], рА^ - значение А[ i, j ] - элемента массива,

Листинг 20. Формирование двумерного динамического массива данных типа byte. Используется указатель на указатель на двумерный массив.

Uses  Crt;

Const  M =  2;   N  =  3;

type { Имена типов: }

ta = array[1..100, 1..N] of byte;     { - двумерный массив    }

pta = ^ ta; { - указатель на массив }

ppta = ^ pta; { - указатель на указатель на массив.}

var A:ppta;{- переменная - указатель на указатель на массив }

i, j : Dyte;

рА : ^byte; { - указатель на значение типа byte }

Begin ClrScr; New (A); {-запрос ОП для А^, 4 байта}

GetMem (А^, М*N*SizeOf (byte)); {- запрос ОП для А^^ } For i := 1 То М Do

For j := 1 То N Do  begin

А^^[i,j] := i+j; {- обращение к элементу массива А }
рА := @ А^^[
i,j]; { - указатель на элемент массива А }

Writeln('А^^[',1,',',j,']=', A^^[i,j], 'рА^ = ', рА^ );

end;

FreeMem (А^,М*N*SizeOf (byte)); { - освобождение ОП А^^}
Dispose (
А );     А := nil; { - освобождение ОП А^  }

End.

Рис. 10

Схема взаимосвязи указателей, адресов и значений двумерного динамического массива. Используется А - указатель на указатель на массив типа ta

На рис. 10 представлена схема взаимосвязи указателя А, адресов и значений двумерного динамического массива программы листинга 20.

В листингах 21 и 22 представлены программы формирования трехмерного динамического массива, аналогичные программам листингов 19 и 20 соответственно. В программах листингов 21 и 22 используется константа К - количество матриц трехмерного массива.

В окно просмотра в процессе выполнения программы листинга 21 можно вывести значения @А, А, А^, рА, рА^ аналогично программе листинга 19. Кроме того, для листинга 21 можно вывести:

А^[1] - значения элементов 1-матрицы;

А^[1,i] - значения элементов i-строки 1-матрицы;

@А^ [ 1, i, j ] - адрес А [ 1, i, j ] - элемента массива;

А^ [ 1, i, j ] - значение А[ 1, i, j ] - элемента массива.

В процессе выполнения программы листинга 22 в окно просмотра можно вывести значения @А, А, А^, А^^, рА, рА^ аналогично программе листинга 20, а также:

А^^[1] - значения элементов 1-матрицы;

А^^[1,i] - значения элементов i-строки 1-матрицы;

@А^^ [ 1, i, j ], рА - адрес А[ 1, i, j ] - элемента массива;

А^^ [ 1, i, j ], рА^ - значение А [ 1, i, j ] - элемента массива.

Листинг 21. Формирование трехмерного динамического массива данных типа byte. Используется указатель на трехмерный массив.

Uses   Crt;

Const К = 2; М = 2; N = 3; { - количество матриц, строк и столбцов}

type { Имена типов:       }

ta=array[1..100,1..М,1..N] of byte;{-трехмерный массив}

pta = ^ ta; { - указатель на массив }

var  A : pta;{ - переменная - указатель на массив }

l, i, j : byte; { - номер матрицы, строки и столбца  }

pА : ^byte; { - указатель на значение типа byte  }

Begin ClrScr;

GetMem (A, K*M*N * SizeOf(byte)); { - запрос ОП для А^}
For l := 1 To К Do { динамического массива }

For i := 1 To M Do

For j := 1 To N Do  begin

A^[l,i,j] := 1 + i + j; {- обращение к элементу массива А}
рА := @ А^[1,
i,j]; { - указатель на элемент массива А}

Writeln

('А^[',l,',', i,',', j,']= ', A^[l,i,j], 'рА^= ', рА^);

end;

FreeMem (А,К*М*N*SizeOf(byte)); { - освобождение ОП А^}

А := Nil;

End.

Листинг 22. Формирование трехмерного динамического массива данных типа byte. Используется указатель на указатель на трехмерный массив.

Uses  Crt;

Const К = 2; М = 2; N = 3; { - количество матриц, строк и столбцов}

type { Имена типов: }

ta = array[1..100,1..М,1..N] of byte; { - массив }

pta = ^ ta; { - указатель на массив }

РРТА = ^ pta;{ - указатель на указатель на массив }

var A:ppta; {- переменная - указатель на указатель на массив}

l, i, j : byte;{ - номер матрицы, строки и столбца }

рА : ^byte; { - указатель на значение типа byte }

Begin  ClrScr;  New ( A ); { - запрос ОП для А^ }

GetMem (А^, К*М*N*SizeOf (byte)); {- запрос ОП для А^^}

For l := 1 То К Do { - динамического массива }

  For i := 1 То М Do

For j := 1 То N Do     begin

А^^[l,i,j]]:=l+i+j; {- обращение к элементу массива А}

рА := @ А^^[1,i,j];{- указатель на элемент массива А}

Writeln

('А^^[',l,',', i,',', j,']= ', A^^[l,i,j], 'рА^= ', рА^);

end;

FreeMem (А^,К*М*N*SizeOf(byte)); { - освобождение ОП А^^}

Dispose ( А ); {  -   освобождение   ОП  А^ }

А := Nil;

End.


 

А также другие работы, которые могут Вас заинтересовать

26641. Вертикальная зональность океана 158 KB
  Общепринятой во всех странах схемы вертикальных зон океана к сожалению пока не существует. Кроме того в некоторых частях Мирового океана различают также: псевдобатиаль фауну внутришельфовых депрессий от 250400 до 1200 м отделенных более или менее мелководными порогами обычно менее 200 м от собственно батиальной зоны примеры: фауна более или менее изолированных глубинных котловин норвежских фьордов и района Магелланова пролива Белого и Балтийского морей южной Аляски антарктического шельфа; псевдоабиссаль фауну обширных...
26642. Круговорот веществ в биосфере 88 KB
  Биогеохимические круговороты. Круговорот веществ в биосфере. Круговорот углерода. Круговорот кислорода.
26643. КУЛЬТУРНЫЙ ЛАНДШАФТ 27 KB
  Ландшафт культурный географический ландшафт измененный хозяйственной деятельностью человеческого общества и насыщенный результатами его труда. и природным ландшафтом нет резкой грани: в Л. основывается на познании связей как между компонентами ландшафта так и между его морфологическими составными частями урочищами фациями и предусматривает достижение максимального воспроизводства естественных в первую очередь биологических ресурсов предотвращение неблагоприятных природных процессов создание здоровой среды для жизни человека...
26644. Ландша́фт 38.5 KB
  Landschaft вид местности от Land земля и schaft суффикс выражающий взаимосвязь взаимозависимость понятие употребляющееся в разных но связанных между собою значениях в географии ландшафтной экологии живописи ландшафтной архитектуре компьютерной графике и т. История понятия Пример ландшафтной живописи Питер Брейгель. Впервые слово ландшафт прозвучало в IX веке в трудах монахов Фульдского монастыря в Германии. Ландшафт укладывается в рамки административнотерриториального и административного понятия.
26646. Ноосфе́ра 25 KB
  Ноосфера новая высшая стадия эволюции биосферы становление которой связано с развитием человеческого общества оказывающего глубокое воздействие на природные процессы. Ноосфера как наука изучает закономерности возникновения существования и развития человека человеческого общества закономерности взаимоотношения человека с биосферой. В окружающем нас мире ноосфера является той частью биосферы которую занимает человек Возникновение и развитие ноосферы В ноосферном учении Человек предстаёт укоренённым в Природу а искусственное...
26647. Основные законы (особенности, признаки) географической оболочки 74.5 KB
  Например пятна на Солнце увеличивают площадь в течение 914 лет а средний цикл солнечной активности 9 14 : 2 = 112 лет. Внутривековые циклы движение Земли в Солнечной системе влажные и прохладные 3540 лет чередуются с тёплыми и сухими колебания водности озёр ритмы солнечной активности 11 3540 90100 лет. Сверхвековые циклы движение Солнечной системы в Галактике образует галактические ритмы длящиеся миллионы лет. лет.
26648. Будыко Михаил Иванович 42 KB
  ЛАНДШАФТНАЯ ЗОНАЛЬНОСТЬ ГЕОГРАФИЧЕСКАЯ ЗОНАЛЬНОСТЬ ШИРОТНАЯ ЗОНАЛЬНОСТЬ – одна из основных географических закономерностей выражающаяся в последовательной географически обусловленной смене типов природных комплексов ландшафтов геосистем экосистем и компонентов природной среды климат четвертичные отложения коры выветривания почвы растительность животный мир поверхностные и подземные воды по широтному градиенту. Их отношение становится основным фактором возникновения природных зон. Сложный характер циркуляции воздушных масс и...
26649. Геосистема 23.5 KB
  Геосистема безразмерная единица географической структуры геосистема наивысшего ранга географическая оболочка и в этом смысле близка к термину экосистемы но последняя обязательно с акцентом на биоту. Термин геосистема очень близок понятию природного территориального комплекса. Экосистема широкое понятие и в этом смысле близко к понятиям комплекс природный1 геосистема но более биологично по существу поскольку центральной концепцией экосистемы является представление о цепях питания и трофических уровнях.