Направления программирования. История создания языка Си. Особенности языка, страница 28

Управление компиляцией программы.

Существуют дополнительные директивы препроцессора, позволяющие контролировать ход компиляции программы. В основном эти директивы предназначены для указания блоков или операторов, подлежащих компиляции. В противном случае эти блоки не будут включены в скомпилированную программу.

Указанные директивы полезны не только в процессе отладки программы, но и позволяют из одного же исходного файла сформировать несколько различных программ, адаптированных к различным условиям, например, к конкретной строке. Этот процесс называют условной компиляцией.

Директива # if связывает выполнение компиляции блока операторов, следующих за директивой, с определенным условием. Условие обычно состоит в проверке того, был ли определен некоторый макрос равный тому или иному значению.

Директива # elif используется вместе с директивой # if для формирования блоков альтернативных условий. Компиляция операторов, следующих за директивой # elif выполняется только в том случае, если не выполнено условие в директиве # if и выполнено условие в директиве # elif.

Директива # elif.

# if условие операторы

# elif условие 2 операторы

# elif операторы

# endif

Пример:

# if USA==1

# define currency ‘S’

# elif BRITAIN==1

# define currency ‘L’

# elif FRANCE==1

# define currency ‘F’

# elif # define currency ‘M’

# endif.

п. 17. Указатели и динамическое распределение памяти в языке Паскаль.

п. 17.1. Объявление указателей.  

Синтаксис задания ссылочного типа (типа указателя)

<ссылочный тип> : : = ^ <идентификатор>

^ - признак ссылочного типа

Примеры: type MAS = array [1..100] of integer;

DMAS = ^ MAS;

var   A: DMAS;

P: ^ long integer;

Q: ^ char;

Значением указателя P может быть ссылка на динамический объект целого типа.

Значением указателя Q может  быть ссылка на динамический объект символьного типа.

Значением указателя A является ссылка на динамический объект, значением которого является массив из 100 целых чисел.

В Паскале пустую ссылку обозначают словом NIL (P:=NIL;), в Си NULL.

В Паскале указатели подразделяются на типизированные и нетипизированные.  

Типизированные указатели могут связываться с некоторым типом данных (пример описания дан выше).

Нетипизированные  указатели – это указатели, которые не связываются с каким-либо конкретным типом данных (для описания таких указателей используется тип POINTER)

Пример: Var P:pionter;     

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

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

п. 17.2. Процедуры динамического распределения памяти.

Данное описанное VAR P:^ LONGINT; означает, что транслятор отводит место в памяти для размещения значения указателя.

Для порождения же самого динамического объекта типа LONGINT, на который указывает данный указатель, необходимо использовать какую-либо процедуру динамического выделения памяти,

Например:  NEW(P);

В результате выполнения этой процедуры выделяется память под динамический  объект и адрес начала этой области памяти записывается в указатель P.   

Для доступа к динамическому объекту используется динамическая переменная (переменные с указателем).

Синтаксис: < динамическая переменная> : : = <указатель> ^

Пример: VAR  P: ^ INTEGER;

BEGIN     NEW(P); P^:=55;      ……

Динамическая переменная (переменная с указателем) может быть использована в любых конструкциях языка, где допустимо использование  переменных того типа, что и тип динамической переменной.

Пример: VAR  R : INTEGER;

R;=R+P^;      …..