Информатика и технология программирования

         

Указатель как элемент архитектуры компьютера


Указатели занимают особое место среди типов данных, потому что они проецируют на язык программирования ряд важных принципов организации обработки данных в компьютере. Понятие указателя связано с такими понятиями компьютерной архитектуры как адрес, косвенная адресация, организация внутренней (оперативной) памяти. От них мы и будем отталкиваться. ВНУТРЕННЯЯ ПАМЯТЬ (ОПЕРАТИВНАЯ ПАМЯТЬ) компьютера представляет собой упорядоченную последовательность байтов или машинных слов (ячеек памяти), проще говоря -массив. Номер байта или слова памяти, через который оно доступно как из команд компьютера, так и во всех других случаях, называется АДРЕСОМ. Если в команде непосредственно содержится адрес памяти, то такой доступ этому слову памяти называется ПРЯМОЙ АДРЕСАЦИЕЙ.

Возможен также случай, когда машинное слово содержит адрес другого машинного слова. Тогда доступ к данным во втором машинном слове через первое называется КОСВЕННОЙ АДРЕСАЦИЕЙ. Команды косвенной адресации имеются в любом компьютере и являются основой любого регулярного процесса обработки данных.

В языках программирования имя переменной обычно ассоциируется с адресом области памяти, в которой транслятор размещает ее в процессе трансляции программы. Поэтому все операции над переменными базовых типов данных преобразуются в команды с прямой адресацией к соответствующим словам памяти.

УКАЗАТЕЛЬ -- переменная, содержимым которой является адрес другой переменной.

Соответственно, основная операция для указателя - это косвенное обращение по нему к той переменной, адрес которой он содержит. В дальнейшем будем пользоваться такими терминами:



-указатель, который содержит адрес переменной, ССЫЛАЕТСЯ на эту переменную или НАЗНАЧЕН на нее;



-переменная, адрес которой содержится в указателе, называется УКАЗУЕМОЙ переменной.

В Си имеется специальная операция - "*" , которую называют КОСВЕННЫМ ОБРАЩЕНИЕМ ПО УКАЗАТЕЛЮ и которая является аналогом косвенной адресации. Кроме того, имеется операция "&#38" , которая дает адрес переменной, перед именем которой она поставлена. Все это позволяет повторить изображенный выше пример с косвенной адресацией с использованием средств языка Си:

Если же эту "картинку" перевести на определения и операции языка, то получим следующее:


int a,x; // Обычные целые переменнные


int *p; // Переменная - указатель на другую


// целую переменную


a = 2000;
p = &#38a; // Указатель содержит адрес переменной a


x = x + *p; // При косвенном обращении по указателю p


// берется значение указуемой переменной a



Содержание раздела