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.


 

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

39987. Межсетевые экраны и их роль в построении защищенных систем 230.34 KB
  Типичные возможности фильтрация доступа к заведомо незащищенным службам; препятствование получению закрытой информации из защищенной подсети а также внедрению в защищенную подсеть ложных данных с помощью уязвимых служб; контроль доступа к узлам сети; может регистрировать все попытки доступа как извне так и из внутренней сети что позволяет вести учёт использования доступа в Интернет отдельными узлами сети; регламентирование порядка доступа к сети; уведомление о подозрительной деятельности попытках зондирования или атаки на узлы сети или сам...
39988. Переполнение буфера 240.81 KB
  Условия для переполнения буфера параметры функций передаются через стек; адрес возврата также помещается в стек; локальные переменные располагаются в стеке; стек растет вниз; данные в стеке могут интерпретироваться как команды; должны существовать процессы или программы имеющие уязвимый код; некоторые процессы или функции должны иметь высокие привилегии. Переполнение буфера Переполнение буфера Buffer Overflow явление возникающее когда компьютерная программа записывает данные за пределами выделенного в памяти буфера....
39989. Безопасность приложений WWW 47.13 KB
  Технические особенности Существенное преимущество построения Web приложений для поддержки стандартных функций браузера заключается в том что функции должны выполняться независимо от операционной системы данного клиента. Классификация угроз безопасности Webприложений Данная классификация представляет собой совместную попытку членов международного консорциума собрать воедино и упорядочить угрозы безопасности Webсайтов. Члены Web ppliction Security Consortiumсоздали данный проект для унификации стандартной терминологии описания угроз...
39990. Автоматизированные информационные системы 959.15 KB
  Автоматизированные информационные системы для студентов специальности Автоматизированные системы обработки информации и управления дневной формы обучения.. Понятие автоматизированной информационной системы. Структура автоматизированной информационной системы. Понятие и виды моделей информационной системы.
39991. Предмет, содержание, методы и задачи информационного менеджмента и маркетинга 99.5 KB
  Широкая информатизация всех сфер жизнедеятельности общества принципиально изменяет роль информации и информационных технологий в социальном и экономическом развитии страны. В таких условиях особое значение приобретают проблемы подготовки квалифицированных специалистов в области менеджмента и маркетинговой деятельности способных работать в условиях развитой информатизации насыщения производства и непроизводственной сферы всевозрастающими потоками информации и управления ими. В бизнесе управлении и маркетинге как ни в какой другой сфере...
39992. Инвестиционный менеджмент 287 KB
  Понятие и содержание инвестиционного проекта. Жизненный цикл инвестиционного проекта и подходы к его структуризации. Основные принципы оценки эффективности инвестиционного проекта. Особенности оценки эффективности на разных стадиях разработки и осуществления проекта.
39993. Логистика 83 KB
  Основная задача и функциональные области логистики. Основная задача логистики. Экономический эффект от использования логистики. Подобный подход к изучению производственнохозяйственной деятельности предприятий возник на Западе в 20е 30е годы ХХго столетия и развиваясь сформировался в самостоятельное направление научнопрактической деятельности получившей название логистики.
39994. Корпоративное управление 109.5 KB
  Пoд кopпopтивным yпpвлeниeм в кциoнepныx oбщecтвx пoнимeтcя cиcтeм oтнoшeний мeждy opгнми yпpвлeния и дoлжнocтными лицми эмитeнт влдeльцми цeнныx бyмг кциoнepми влдeльцми oблигций и иныx цeнныx бyмг ткжe дpyгими зинтepecoвнными лицми тк или инчe вoвлeчeнными в yпpвлeниe эмитeнтoм кк юpидичecким лицoм. К oблcти кopпopтивнoгo yпpвлeния oтнocятcя вce вoпpocы cвязнныe c oбecпeчeниeм эффeктивнocти дeятeльнocти кoмпнии и c зщитoй интepecoв ee влдeльцeв в тoм чиcлe peгyлиpoвниe внyтpeнниx и внeшниx pиcкoв. Оcнoвнoй экoнoмичecкoй пpичинoй...
39995. Исследование систем управления 206 KB
  Объeкт иccлeдoвния этo coвoкyпнocть cвязeй oтнoшeний и cвoйcтв cyщecтвyющя oбъeктивнo и cлyжщя иcтoчникoм нeoбxoдимoй для иccлeдoвтeля инфopмции пpeдмeт кoнкpeтня пpoблeм peшeниe кoтopoй тpeбyeт пpoвeдeния иccлeдoвний; тип иccлeдoвния пpиндлeжнocть eгo к oпpeдeлeннoмy типy oтpжющeмy cвoeoбpзиe вcex xpктepиcтик; пoтpeбнocть иccлeдoвния cтeпeнь ocтpoты пpoблeмы пpoфeccиoнлизм в пoдxoдx к ee peшeнию cтиль yпpвлeния; peзyльтт иccлeдoвния peкoмeндции мoдeль фopмyл мeтoдик cпocoбcтвyющиe ycпeшнoмy pзpeшeнию пpoблeмы...