ВУЗ:
Составители:
Рубрика:
ществлять длительное хранение промежуточных данных программы. Поэтому этот способ адресации
данных в целом является малоэффективным.
Вместо регистров процессора для хранения информации необходимо использовать ячейки основной
памяти. Здесь возможны два случая. В первой команде сообщается машинный адрес ячейки памяти,
хранящей нужную ей информацию. Этот способ адресации носит название абсолютной адресации. Са-
ма ячейка находится в сегменте данных. Способ довольно удобный, но команда может обратиться толь-
ко к одной ячейке памяти, адрес которой ей сообщен.
Гораздо большей эффективностью будет обладать способ адресации, при котором команда получит
адрес ячейки памяти в виде суммы двух элементов: некоторого базового адреса и относительного сме-
щения. Эти элементы записываются в коде команды. Такой способ адресации получил название косвен-
ной адресации. При использовании этого способа команды получают возможность обращаться к целому
диапазону ячеек памяти.
Таким образом, мы подошли к особому типу данных, позволяющему хранить информацию непо-
средственно в том виде, в каком ее воспринимает и обрабатывает вычислительная техника. Этот тип
данных называется указатель. Указатели представляют собой программные объекты, содержащие адре-
са других программных объектов. Они могут быть указателями-переменными и указателями-
константами. Указатели подразделяются на указатели на функции и указатели на другие программные
объекты. Это разделение связано с различиями в свойствах и правилах их использования.
В простейшем случае определение и описание указателя выглядит следующим образом:
тип *имя_указателя = инициализирующее_выражение;
здесь тип – базовый тип указателя; имя указателя – идентификатор;
* – унарная операция обращения по адресу (разыменования); инициализирующее выражение – возмож-
ный инициализатор соответствующего типа данных.
В совокупности знак '*' и имя типа воспринимаются как обозначение особого типа данных "указа-
тель на объект данного типа". В качестве инициализирующего выражения должно выступать констант-
ное выражение, представленное:
− явно заданным адресом участка памяти;
− указателем, уже имеющим значение;
− выражением, позволяющим получить адрес объекта с помощью операции получения адреса про-
граммного объекта '&'.
Для обозначения "пустого" указателя используется специальная константа 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-байт каждый;
Страницы
- « первая
- ‹ предыдущая
- …
- 18
- 19
- 20
- 21
- 22
- …
- следующая ›
- последняя »
