Адресный тип данных

Память компьютера можно рассматривать как последователь­ность байтов, номера которых (О, 1, 2,...) называются адресами. Каждая переменная в памяти занимает в зависимости от ее типа некоторое количество последовательных байтов. Например, пере­менные типа char - 1 байт, а большие массивы - тысячи байтов.

Адресом переменной считается адрес ее первого байта. Не каждый адрес может быть адресом переменной. Например, переменные типа integer могут иметь лишь четные адреса. Адресный тип данных (Pointer) определяет переменные, которые могут содержать значения адресов данных или фрагментов

 

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

 

Пример ^integer обозначает мно­жество адресов целых,

 

^array [1. .50] of char - множество адресов массивов, образованных из 50 символов,

^record pole1, pole2 : realend - множество адресов записей из двух действитель­ных переменных.

Типом T может быть произвольный тип, кроме типа файла. Тип, обозначенный как ^T, называется адресным, а тип T - базовым для него.

Для обозначения адреса переменной x в языке Pascal определена операция @, которая записывается как @х, Имя nil обозначает адрес 0, принадлежащий всем возможным типам ^Т. Этот адрес не может быть

адресом ни одной переменной, т.е. является "ничейным", фиктивным, который ни на что не указывает.

К однотипным адресам применимы опера­ции сравнения на равенство = и неравенство <>.

Обычно переменная хранит некоторые данные. Помимо таких переменных

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

 

Такие переменные называются указателями. Это можно изобразить графически

Обычная переменная

 


 
 

 

Переменная - указатель

 

 


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

Имя :^T

Где Имя – имя переменной указателя;

T – тип переменной на которую указывает указатель

В языке Pascal употребляются типизированные указатели - переменные типа ^Т. Они еще называются указателями типа Т. Им можно присваивать адреса переменных только типа Т или nil. Когда адрес переменной присваивается указателю, то говорят, что он устанавливается на переменную.

Пример 3.16. Описание переменных - указателей.

p:^real;

s:^integer;

 

Переменная типа p – это указатель на переменную типа real, s – на переменную типа integer.

В начале работы программы переменная – указатель ни на что не указывает, т.е. указатель пустой и имеет адрес 0 (NIL).

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

 

Пример Операция присвоения указателю q2 значения указателя q1

q2:=q1;

q2 и q1 указывают на одну переменную.

К указателям применима операция разыменова­ния со знаком "^".

Если р - указатель типа ^T, то выражение р^ задает переменную типа Т, на которую установлен р.

Если указатель р установлен на переменную х, то выражения х и р^ эквива­лентны.

Указатель можно использовать для того, чтобы присвоить значение переменной, на которую он указывает. Например, если s указывает на k, то

в результате выполнения инструкции

s^:=45;

значение переменной k будет равно 45.

Пример 3.18. Применение операции разыменования для задания значений элементам массива. при

Type

mas =array [1..10]of integer;

Var

x : mas;

p : ^mas;

 

В примере 17.1 элемент массива с индексом i можно задать как х[i], так и как р^[i], т.е.вместо присваивания х[1]:=4 можно написать р^ [1]: =4 или вместо х[2] :=sqr(х[1]) - присваивание р^[2 ]: =sqr(р^ [1]).

 

Примечание








Дата добавления: 2015-01-13; просмотров: 2792;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.