Этапы разработки программы. Разработка или выбор алгоритма решения поставленной задачи. Оформление документации на программу, страница 18

readln (c);                       k := k+1;

y1 := y1 + (c)                 readln (c);

end;                                 y1 := y1 + (c)

until E oln;

{вывод множества}

for c := chr(0) to chr(255) do

if c in y then write(‘’, c);

§18 Динамическое распределение памяти. Указатели.                

Динамическая память – это оперативная память (ОП) компьютера, которая предоставляется программе при ее работе. ОП представляет собой совокупность ячеек, называемых байтами, каждая из которых имеет собственный номер. Этот номер называется адресом. Он позволяет обращаться к любому байту памяти. Динамическая память – это практически единственная возможность обработки массивов данных большой размерности.

Динамическое распределение означает, что память под отдельные программные объекты выделяется в момент, когда они начинают существовать во время выполнения программы. Компилятор в этом случае выделяет фиксированный объем памяти для хранения адреса объекта, а не для самого этого объекта. При динамическом размещении заранее не известен ни тип, ни количество размещаемых данных, к ним нельзя обращаться по имени, как к статическим.

18.1Средства управления динамической памятью. Указатели.

Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти, т.е. указатель – это переменная, значение которой сообщает о том, где размещен программный объект, но не говорит о самом объекте.

Синтаксис объявления:

PASCAL var<имя указателя на переменную заданного типа>: ^<идентификатор типа>;

C<идентификатор типа> *< имя указателя на переменную заданного типа >

Пример:

PASCAL  var uk : ^ integer;

f : ^ real;

ch : ^ char;

C

int *uk;  // Указатель на переменную целого типа

float *f; // Указатель на переменную с плавающей запятой

char *ch; // Указатель на переменную символьного типа

Наиболее важные операции, связанные с указателями.

Операция определения адреса (@ - PASCAL, & - C)

Операция обращения по адресу (^ - PASCAL, * - C)

Операция обращения по адресу служит для присваивания или считывания значения переменной, размещенной по адресу, хранимому в переменной указатель.

Операция определения адреса возвращает адрес памяти своего операнда: <адрес>=&<переменная>.

Пример:

C: int x,i,j.*y;                                 PASCAL:  var x,y : ^ integer;

x=&i;                                                                   i, j : integer;

*x=15;                                                                 x := @ I;            (**)

y=*x;                                                                   x ^:= 15;  

j := x ^;

y := x;        

Написание int *x  в языке C приводит к тому, что компилятор резервирует память для хранения адреса переменной целого типа, но не выделяет 2-ух байт для хранения целого числа. Для выделения 2-ух байт для хранения целого числа нужно использовать одну из функций динамического распределения памяти, например, malloc в языке C, new – в PASCAL.

C: int x=(int*) malloc(sizeof(int));  (*)

В результате выполнения оператора

1) в динамической памяти выделяется 2 байта, где можно разместить целое;

2) Адрес начала выделенного блока памяти присваивается указателю x.

Замечание1: Функция malloc в качестве параметра использует количество байт, которое нужно зарезервировать и возвращает указатель на тип void. Для того чтобы в данном случае функция malloc вернула в качестве результата указатель на целое, необходимо использовать явное преобразование (int*).

В языке PASCAL аналогичный (*) оператор выглядит следующим образом:

Var x : ^ integer;

New(x);

Замечание2:  Процедура new языка PASCAL выделяет память под динамические переменные блоками по 8 байт.  

Для освобождения памяти запрошенной функцией malloc языка C используется функция: free(<имя указателя>). Для освобождения памяти, выделенной процедурой new языка PASCAL используется процедура dispose(<имя указателя>).

Способы задания указателю осмысленного значения.