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.


 

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

57375. Повторення складу чисел 5 і 6. Складання й розв’язання прикладів за малюнками предметів і монет 31 KB
  Назвіть усі числа від 1 до 7. Яке число стоїть за числом 7 Більше воно чи менше 7 Назвіть усі числа менше 7. За яким числом воно стоїть Як утворити число 6 додаючи 1 Порівняйте числа 6 і 7. Порівняйте числа 3 і 5.
57379. Складання прикладів на віднімання з прикладів на додавання. Складання й розв’язання прикладів за малюнками. Написання цифр 28.5 KB
  Мета: вдосконалювати вміння учнів складати приклади на віднімання та додавання користуючись протилежними діями; вправляти учнів у складанні прикладів за малюнками; формувати графічні навички...
57380. Складання таблиць додавання та віднімання числа 3. Задачі на збільшення та зменшення числа на кілька одиниц 31.5 KB
  Мета: розкрити принцип укладання таблиць додавання й віднімання числа 3; вдосконалювати навички усної лічби; розвивати вміння розвязувати задачі на збільшення та зменшення числа на кілька одиниць...
57381. Вправи та задачі на засвоєння таблиць додавання й віднімання числа 3. Розв’язання задач на знаходження суми. Вимірювання довжини відрізка 29.5 KB
  Мета: вправляти учнів у розвязанні прикладів й задач використовуючи таблиці додавання й віднімання числа 3; вдосконалювати навички усної лічби; продовжити роботу над формуванням в учнів уміння креслити вимірювати відрізки; розвивати логічне мислення.
57382. Складання задачі, яка містить поняття стільки ж. Задачі на знаходження остачі. Вправи на задачі на засвоєння таблиць додавання й віднімання числа 3 31.5 KB
  Мета: закріплювати знання учнями таблиць додавання й віднімання 3; формувати вміння розвязувати задачі на знаходження остачі й задачі що містять у собі поняття стільки ж; вдосконалювати навички усної лічби...