Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

16. Указатели

Предыдущий раздел:

Следующий раздел:

16.1. Ссылочные типы и указатели

Каждая область памяти имеет свой адрес. Грубо говоря, все байты пронумерованы, и эти номера и есть адреса. Значения переменных хранятся в памяти и соответственно у каждой переменной есть свой адрес. Указателем называется переменная, в которую записан адрес некоторой области памяти. Например, в указателе может быть записан адрес, по которому хранится значение какой-нибудь другой переменной.

Типы переменных для хранения указателей называются ссылочными типами. Для описания ссылочного типа используется символ «^» и имя базового типа. Базовым типом может быть любой тип, кроме файлового, включая описанные вами самими типы.

Примеры описания ссылочных типов:

  type
    PInteger = ^integer;
    PReal = ^real;

    {Обычный тип-массив, не ссылочный}
    TMyArray = array [1..10] of real; 
    {А это уже соответствующий ссылочный тип}
    PMyArray = ^TMyArray; 

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

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

  var
    X, Y: integer; {Обычные переменные, не указатели}
    P: ^integer; {Указатель на целое число}
    P2: PInteger; {Тоже указатель на целое число,
                   тип которого был описан выше}

Тогда допустима следующая операция:

  P:=@X;

Значением указателя P станет адрес, по которому хранится значение переменной X.

Зная адрес, можно узнать, какое значение по этому адресу записано или записать значение в память с этим адресом. Для этого используется так называемая операция разименования указателя (dereference, если по-английски). Она обозначается символом «^», который ставится после имени переменной-указателя. Например:

  {В область памяти с адресом P записывается число 5}
  P^:=5; 
  {В переменную X записывается значение, хранящее по адресу P}
  X:=P^; 

С разименованными указателями (после которых поставили символ «^») можно работать как с обычными переменными.

Пусть выполняются операторы:

  X:=3;
  P:=@X;
  P^:=5;

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

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

  var
    z: ^PInteger;

Возможные значения такой переменной – адреса в памяти, где хранятся адреса, по которым записаны целые числа.

Среди возможных значений указателей выделяется одно особенное значение – nil. Указатель, имеющий значение nil, «никуда не указывает». Указатель nil, считается константой, которую можно присвоить указателю любого типа.

Следующий раздел:

Предыдущий раздел:

Добавить комментарий