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.


 

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

62898. Внеклассное мероприятие, посвященное 8 марта «А ну-ка девочки!» 27.72 KB
  Какой конкурс вам понравился больше всего Умницы Спасибо за активное участие Жюри подводят итоги и каждой девочке присваивают номинацию: Мисс Восхитительная; Мисс Привлекательная; Мисс Чарующая...
62899. Внеклассное мероприятие, посвященное дню 8 марта: «Вечернее ТВ» 24 KB
  Цели: Развитие творческой инициативы, активности и самостоятельности учащихся; Формирование чувства ответственности за порученное дело, умения доводить его до конца; Воспитание уважительного отношения к девочкам, развития чувства доброты, желания дарить людям радость.
62900. Внеклассное мероприятие для учащихся 9–11-х классов, посвященное 8 Марта "Все для милой…" 20.44 KB
  Цель: развивать чувство уважения друг к другу, творческие способности учащихся, их индивидуальность, фантазию и изобретательность. Оформление, оборудование, инвентарь: бумага, фломастеры, канцелярские скрепки; предметы для проведения конкурсов...
62902. Внеклассное мероприятие, посвященное 23 февраля: А ну-ка, мальчики! 19.22 KB
  Ребята а вы знаете как делали книги раньше Сначала их писали на глине на коре деревьев на шкурах животных. Писали на бумаге вручную поэтому переписывание одной книги занимало не один год. Книги в то время считались роскошью.
62904. Игра «Поле чудес»: «Лекарственные растения» 23.11 KB
  Цели занятия: расширить знания учащихся о лекарственных растениях; развивать внимание память любознательность самостоятельность суждений; воспитывать бережное отношение к своему здоровью любовь к природе животному и растительному миру планеты.
62905. Косметика и мы 332.29 KB
  Правила нанесения: 1 нанести на лицо и шею увлажняющий крем; 2 увлажнить губку и нанести на нее тональный крем подходящий по цвету вашей коже; 3 немного румян нанести на скулы и растереть в направлении к ушам...