Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fortran 90. ANSI Standard.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
861.18 Кб
Скачать

Присваивание указателя

Здесь два оператора, которые должны действовать на указатели:

  • Оператор присваивания указателя (=>)

  • Оператор присваивания (=)

Чтобы связать указатель с адресатом используют оператор присваивания указателя (=>):

pointer => target

Где pointer есть переменная указателя и target любой правильный адресат. Теперь pointer должна быть использована в качестве вымышленного имени данного, хранимого адресатом target. Итак оператор присваивания указателя выделяет память, требуемую указателем.

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

Ниже примеры оператора присваивания:

INTEGER, POINTER :: pt

INTEGER, TARGET :: x=34, y=0

...

pt => x ! pt указывает на x

y = pt ! y эквивалентно x

pt => y ! pt указывает y

pt = 17 ! y эквивалентно 17

Эти операторы объявления специфицируют три переменных: pt указатель целого; x и y допустимые адресаты указателя. Первый выполняемый оператор связывает адресат х с pt. Второй выполняемый оператор заменяет значение переменной y на значение адресата указателя pt - только оно будет выделено, когда pt свяжется с адресатом. Третий выполняемый оператор меняет связь указателя с другим адресатом. Наконец, четвертый выполняемый оператор связывает новое значение 17 с адресатом pt (но не с самим pt !). Результат вышеприведенных операторов иллюстрируется ниже:

 

Возможно связать адресат с указателем, используя другой указатель. Например:

REAL, POINTER :: pt1, pt2

...

pt2 => pt1 ! верно только если pt1 имеет связанный адресат

Не смотря на это может появиться указатель, указывающий на другой указатель, pt2 не указывающий на pt1 самого, но на адресат указателя pt1. Неправильно думать об 'оковах указателя', одного указателя на другой. Вместо этого все такие указатели связываются с одним и тем же адресатом.

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

pt1 => 17 ! константное выражение - не верный адресат

pt2 => pt1 + 3 ! арифметическое выражение - не верный адресат

 Я

Разыменование (Dereferencing)

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

Указатель автоматически разыменовывается, когда он появляется:

  • Как часть выражения

  • В операторе I/O

Например:

pt => a

b = pt ! b устанавливается равным значению a - pt разыменовано

IF( pt<0 ) pt=0 ! pt разыменовано всегда

WRITE(6,*) pt ! адресат указателя pt записан

READ(5,*) pt ! значение сохранено у адресата указателя pt

 Я

Статус (состояние) связи указателя

Указатель может быть в одном из трех состояний:

  • связан - когда указывает на на правильный адресат

  • откреплен - результат оператора NULLIFY

  • неопределен - начальное состояние после определения

Указатель может получить " откреплен " в результате оператора NULLIFY:

NULLIFY( список указателей )

Указатель, который может быть анулирован, может с помощью указания "ничто".

Статус указателя можно узнать с помощью встроенной функции:

ASSOCIATED ( список указателей [,TARGET] )

Значение, возвращаемое с помощью ASSOCIATED есть .TRUE. или .FALSE. . Когда TARGET отсутствует, ASSOCIATED возвращает значение .TRUE., если указатель связан с адресатом, и .FALSE., если указатель анулирован. Когда задан TARGET, ASSOCIATED сообщает, указывает ли указатель на адресат в вопросе. ASSOCIATED возвращает значение .TRUE. , если указатель связан с TARGET, и .FALSE. , если указатель указывает на другой адресат или может быть анулирован.

Это есть ошибка тестирования статуса неопределенного указателя. Рекомендуется обнулять все указатели, которые не связаны непосредственно с адресатом после определения.

Следующий пример показывает использование функции ASSOCIATED и оператора NULLIFY:

REAL, POINTER :: pt1, pt2 ! неопределенный статус

REAL, TARGET :; t1, t2

LOGICAL :: test

pt1 => t1 ! pt1 связан

pt2 => t2 ! pt2 связан

test = ASSOCIATED( pt1 ) ! .T.

test = ASSOCIATED( pt2 ) ! .T.

...

NULLIFY( pt1 ) ! pt1 связь анулирована

test = ASSOCIATED( pt1 ) ! .F.

test = ASSOCIATED( pt1, pt2 ) ! .F.

test = ASSOCIATED( pt2, TARGET=t2) ! .T.

test = ASSOCIATED( pt2, TARGET=t1) ! .F.

NULLIFY( pt1, pt2) ! связь анулирована

Неопределенный начальный статус указателей изменен на связанный оператором присваивания указателя. Затем функция ASSOCIATED возвращает значени .TRUE. для обоих указателей. Указатель pt1 анулирован и его статус снова проверяется. Статус связи для pt2 относительно адресата снова проверяется. Наконец, оба указателя анулируются в одном операторе..

Я

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]