Ссылка – это переменная, которая может быть связанна с другой переменной, называемой адресатом, так что при обращении к ссылке будет происходить обращение к адресату и наоборот. Ссылка может рассматриваться как псевдоним адресата. Если в переменную-адресат поместить значение 10, то и в переменной-адресате так же будет значение 10.
Если в переменную-адресат поместить значение 50, то и в переменной-ссылке так же будет значение 50.
Для описания ссылки используется атрибут pointer (стрелка, указатель), например
Integer? Pointer :: p
Означает, что переменная p будет являться ссылкой на переменную типа integer.
Переменная, на которую будет ссылаться ссылка, называется адресатом и должна иметь атрибут target (цель)
Integer, target :: a
Для присвоения ссылки к адресату используется специальный оператор =>,
Program prog
Integer, pointer :: p
Integer, target :: a
a=100
p=>a ! прикрепили ссылку к адресату
write(*,*) p
end
Результат : 100
Cследовательно ссылка и адресат стали содержать одно и то же значение 100.
Основная особенность ссылок состоит в том, что если изменить значение а, то значение р тоже изменится в отличие от следующей записи:
Program prog Program prog
Integer p Integer, pointer :: p
Integer a Integer, target :: a
a=100 a=100
p=a p=>a
a=500 write(*,*) p
write(*,*) p a=500
end write(*,*) p
end
Результаты соответственно будут
1)100
2)100
500
В процессе работы программы ссылку можно прикреплять к разным адресатам.
Program prog
Integer, pointer :: p
Integer, target :: a, b, c
a=100; b=200; c=300
p=>a
p=p*2
p=>b
p=p/2
p=>c
p=p+100
write(*,*) a, b, c
end
Результаты: 200 100 400
Память может отводиться пи использовании оператора allocate либо после прикрепления ссылки к размещённому адресату.
Program prog
Integer, pointer :: p(:)
Integer, allocatable, target :: w(:)
Allocate (w(3))
W=100
P=>w ! присоединили ссылку к динамическому массиву
Write (*,*) p
End
Функция associated(pt, addr) возвращает true если ссылка pt привязана к адресату addr, в частности если две ссылки указывают на один адресат.
Для разрыва связи используется оператор nullify(pt). После разрыва память выделенная адресату будет недоступной для её освобождения следует использовать оператор deallocate(addr)
Списки и структуры со ссылками на себя
Ссылки позволяют организововать специальные динамические структуры – списки, стеки, деревья, очереди. Для описания элемента списка используется, например, следующий структурированный тип данных:
Type element
Integer info
type (element), pointer :: arrow
end type element
Таким образом элемент определён рекурсивно. В нём присутствует информационное поле info и ссылочное поле arrow на переменную типа element.
Пример. Создать односвязный список и вывести содержание этого списка на экран. Пусть элементами списка будут выступать чмсла 100, 200 и т.д.
Program list
Type element
Integer index
Type (element), pointer :: arrow
End type element
Type (element), pointer :: phead, pt
Nullify(phead)
Do i=1, 5
Allocate(pt)
Pt=element(i*100, phead)
Phead=>pt
End do
Pt=>phead ! ссылка на голову
Do while (associated(pt))
Write(*,”(a,i4)”) “Index…”,pt.index
Pt=>pt.arrow
End do
Результаты:
Index…500
Index…400
Index…300
Index…200
Index…100
В программе используются две ссылки: phead ссылка на голову и pt – ссылка на текущий элемент списка. При помощи конструктора происходит инициализация элемента, в поле index заносится значение 100, поле arrow указывает на обнулённую голову phead. Затем в результате присваивания голова списка становится текущим элементом. Таким образом, в памяти формируется связанная структура: голова списка ссылается на соседний элемент, тот в свою очередь, на следующий и так до последнего элемента, который ссылается на обнулённую голову. Для вывода организуем цикл, который проверяет не прикрепляется ли ссылка к адресату с помощью associated.
Целочисленные указатели
Целочисленный указатель – это переменная типа integer, содержащая адрес некоторой переменной, называемой адресной переменной. Если ссылка – это переменная, которая ссылается на другую переменную, при этом имеет такой же тип, как и переменная-адресат, то целочисленный указатель это переменная, которая содержит адрес переменной.
Для описания целочисленного указателя используется оператор pointer.
Например, указатель на вещественную переменную:
Real a
Pointer (p,a)
Здесь а выступает для хранения значения, p – для хранения адреса переменной. Другими словами, для описания целочисленного указателя используются базируемая переменная и указатель.
Пример указатель на символьную переменную.
Character c
Pointer(p,c)
Указатель на переменную типа student.
Type student
Character(10) name
Integer year
End type student
Type (student) s
Pointer (p,s)
Чтобы вычислить фдрес переменной, используется функция loc
Program prog
Integer pa
Pointer(p,pa)
Integer :: b=1000
P=loc(b)
Pa=500
Write (*,*) b
B=700
Write (*,*) “addres =”,p,”value =”, pa !вывели адрес и значение
End
Результаты:
500
Address = 4403268 value = 700
При работе с указателями можно выполнять арфметические действия. При этом следует учитывать кол-во байтов памяти, отводимое под тип базированной переменной.