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.


 

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

79372. Збережемо книги 44.5 KB
  Мета: закріпити знання та вміння учнів щодо правил поведінки з книгою, виховувати любов і бережливе ставлення до книги, відремонтувати підручники. Обладнання: роздатковий матеріал у вигляді коміксу, пам’ятка для учнів, щодо збереження книг, ножиці, клей, папір, клейка стрічка.
79374. Принцип толерантності 72.5 KB
  Ознайомити учнів із поняттям «толерантність»; формувати ціннісні відношення дитини до самого себе; формувати уявлення про різновиди толерантності, готовності розуміти, приймати, спілкуватися з іншими людьми, взаємодіяти з ними на основі співчуття, співрозуміння, доброзичливості
79375. Поняття про основні галузі господарства і технології, які в них застосовуються. Правила внутрішнього розпорядку і правила безпечної роботи в шкільних майстернях 22.38 KB
  Мета: ознайомити учнів із програмою й об’єктами праці, основними галузями виробництва, із прикладами технологій, які в них застосовуються; повторити правила внутрішнього розпорядку і безпечної роботи в шкільних майстернях; навчити характеризувати основні галузі виробництва і види технологій...
79376. Основные причины вынужденного автономного существования 49 KB
  Нахождение человека в сложных условиях изолированности когда ограничена или исключена вероятность помощи и возможность использования технических и других достижений. Основные причины вынужденного автономного существования АС в природных условиях схему...
79377. Автономное существование человека в условиях природной среды 57 KB
  Способствующие: хорошее здоровье, высокие морально-волевые качества, психофизиологическая устойчивость организма, наличие средств для жизнедеятельности в экстремальных условиях (одежда, снаряжение водно-пищевой запас), подготовленность к действиям в экстремальных условиях.
79378. Комп’ютери бувають різні 66.5 KB
  Мета: сформувати уявлення про види компютерів; розглянути види компютерів та сфери їх застосування; повторити правила безпечної роботи та поведінки в компютерному класі правила вибору переміщення обєктів; вчити робити висновки узагальнення доводити власну думку...
79379. ПРАВИЛА БЕЗОПАСНОГО ПОВЕДЕНИЯ В СИТУАЦИЯХ КРИМИНОГЕННОГО ХАРАКТЕРА 36.5 KB
  Не держите деньги в карманах в которые легко проникнуть вору. Ключи и кошелек храните во внутренних карманах При выходе из дома в темное время суток избегайте малолюдных и плохо освещенных мест пустынных парков и скверов; на улице держитесь подальше от стен домов.