
- •Управление векторами и матрицами
- •Компиляция и выполнение Компиляция
- •Связывание (редактирование связей )
- •Выполнение
- •Примеры
- •Соглашения о записи кода
- •Арифметические выражения
- •Операции отношения
- •Логические выражения
- •Сравнение символов
- •Переносимость результата
- •Спецификация массивов
- •Сечения массива Индивидуальные элементы
- •Сечения
- •Векторные указатели
- •Память для массива Физическая память:
- •Присваивание массива Присваивание всего массива
- •Присваивание секции (вырезки) массива
- •Повторная нумерация
- •Основные встроенные процедуры
- •Массивы нулевого размера
- •Массивы и производные типы
- •Инициализация массивов Конструкторы
- •Оператор data
- •Встроенные функции для массива
- •Пример упрощения
- •Пример исследования (запроса)
- •Пример конструирования
- •Пример локализации
- •Я Операторы управления
- •Вложения
- •Порядок операторов
- •Синтаксис программы Main
- •Формат представления программы
- •Программные единицы
- •Уровни доступа
- •Дополнения
- •Спецификация входных-выходных параметров
- •Использование модуля
- •Родовые подпрограммы
- •Интерактивный ввод-вывод
- •Простой Input и Output
- •Форматирование по умолчанию
- •Форматированный ввод-вывод I/o
- •Дескрипторы редактора
- •Вещественные - форма с фиксированной точкой
- •Вещественные - экспотенциальная форма
- •Символьные
- •Логические
- •Заполнение пробелами (пропуск символьных позиций)
- •Специальные символы
- •Списки ввода-вывода
- •Производные типы данных
- •Неявный цикл do
- •Ввод-вывод без продвижения
- •Файловый ввод-вывод
- •Номера устройств
- •Операторы read и write
- •Оператор write
- •Оператор open
- •Оператор close
- •Оператор inquirе
- •Динамический массив
- •Распределяемые массивы
- •Спецификация
- •Выделение и возвращение памяти
- •Статус распределяемых массивов
- •Потоки памяти (куча)
- •Что есть указатели?
- •Указатели и адресаты
- •Спецификации указателя Общая форма для операторов определения указателя и адресата такая:
- •Присваивание указателя
- •Разыменование (Dereferencing)
- •Статус (состояние) связи указателя
- •Динамическая память
- •Общие ошибки
- •Указатели в производных типах данных
- •Связанные списки
- •Параметры - указатели
- •Функции для указателей
Присваивание указателя
Здесь два оператора, которые должны действовать на указатели:
Оператор присваивания указателя (=>)
Оператор присваивания (=)
Чтобы связать указатель с адресатом используют оператор присваивания указателя (=>):
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 относительно адресата снова проверяется. Наконец, оба указателя анулируются в одном операторе..
Я