Основы программирования для автоматизированного проектирования и решения творческих задач. Романенко А.В - 17 стр.

UptoLike

Составители: 

Вместо регистров процессора для хранения информации необходимо использовать ячейки основной памяти. Здесь воз-
можны два случая. В первой команде сообщается машинный адрес ячейки памяти, хранящей нужную ей информацию. Этот
способ адресации носит название абсолютной адресации. Сама ячейка находится в сегменте данных. Способ довольно удоб-
ный, но команда может обратиться только к одной ячейке памяти, адрес которой ей сообщен.
Гораздо большей эффективностью будет обладать способ адресации, при котором команда получит адрес ячейки памя-
ти в виде суммы двух элементов: некоторого базового адреса и относительного смещения. Эти элементы записываются в ко-
де команды. Такой способ адресации получил название косвенной адресации. При использовании этого способа команды по-
лучают возможность обращаться к целому диапазону ячеек памяти.
Таким образом, мы подошли к особому типу данных, позволяющему хранить информацию непосредственно в том виде,
в каком ее воспринимает и обрабатывает вычислительная техника. Этот тип данных называется указатель. Указатели пред-
ставляют собой программные объекты, содержащие адреса других программных объектов. Они могут быть указателями-
переменными и указателями-константами. Указатели подразделяются на указатели на функции и указатели на другие про-
граммные объекты. Это разделение связано с различиями в свойствах и правилах их использования.
В простейшем случае определение и описание указателя выглядит следующим образом:
тип *имя_указателя = инициализирующее_выражение;
здесь типбазовый тип указателя; имя указателяидентификатор; * – унарная операция обращения по адресу (разымено-
вания); инициализирующее выражениевозможный инициализатор соответствующего типа данных.
В совокупности знак '*' и имя типа воспринимаются как обозначение особого типа данных "указатель на объект данного
типа". В качестве инициализирующего выражения должно выступать константное выражение, представленное:
явно заданным адресом участка памяти;
указателем, уже имеющим значение;
выражением, позволяющим получить адрес объекта с помощью операции получения адреса программного объекта
'&'.
Для обозначения "пустого" указателя используется специальная константа NULL.
П р и м е р 8
char ch = 'y';
char *pch =&ch, *pc = pch;
int *i =NULL;
В результате появилась ячейка памяти, к которой можно обращаться непосредственно через ее имя ch или при помощи ука-
зателя. В последнем случае необходимо использовать операцию '*' – обращение по адресу (разыменование). Попытка разы-
менования пустого указателя не имеет смысла.
Для того, чтобы связать указатель с некоторой областью памяти, необходимо пользоваться стандартными функциями,
прототипы которых находятся в заголовочном файле stdlib.h:
void *malloc(unsigned n); – возвращает указатель на блок динамически распределяемой памяти длиной n-байт;
void *calloc(unsigned m, unsigned n); – возвращает указатель на начало области динамически распределяемой памяти для раз-
мещения m элементов по n-байт каждый;
void *realloc(void *blok, unsigned n); – изменяет размер блока ранее выделенной динамической памяти с адресом начала blok
до размера n-байт;
void free(void *blok);освобождает ранее выделенный блок динамической памяти.
В случае неудачи функции malloc, calloc и realloc возвращают значение NULL.
При определении указателя и он сам и его значение могут быть объявлены константами. Ближний к имени указателя
модификатор const говорит о постоянстве значения указателя. Такой указатель должен получить значение при инициализа-
ции:
тип const *const имя_указателя = инициализатор;
Если же указать const перед операцией разыменования '*', то это говорит о постоянстве значения, на которое указывает ука-
затель.
П р и м е р 9
void main (void)
{
char *const key = (char *) 0x 0417;
*key = 'Е';
}
В результате работы программы из примера 9 в операционных системах MS DOS и WINDOWS 9X будут включены ин-
дикаторы Caps Lock, Num Lock и Scroll Lock на клавиатуре. При этом в программе нельзя изменять значение указателя key.