Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1.docx
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
364.88 Кб
Скачать

Объявление указателей.

Язык Си позволяет вам объявить объект, который будет содержать указатель на объекты любого примитивного или сложного типа данных. Для определения указателя надо использовать символ * в объявлении объекта.

Синтаксис объявления указателя аналогичен объявлению переменных остальных типов:

Класс_памяти тип_данных * имя;

Например:

int * pt ; /*указатель на целое значение*/

char * cp ; /*указатель на символ*/

float * t /*указатель на значение с плавающей точкой*/

В результате переменная pt будет указывать на объекты типа int, cp – char, t – float (заметьте, что символ * не включается в имя переменной).

Модификатор const.

При объявлении переменных, к указателям, как и к другим типам данных может быть применён модификатор const. Этот модификатор означает, что значение переменной не может быть изменено, и переменная всегда сохраняет значение, заданное в процессе инициализации. Т.е., если в программе присутствует следующее определение:

const char* p=0x5FFF;

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

p++;

то компилятор выдаст ошибку.

Переменные с типом указатель, созданные с модификатором const называются константными указателями.

Операции.

При работе с указателями часто применяются следующие операции:

  • & - получение адреса переменной.

  • * - операция косвенной адресации.

  • [] – операция индексации.

Операция & применима к переменной любого типа. Она просто возвращает адрес памяти, в которой хранится значение переменной.

Пример:

char i;

char* p;

p=&i;

В результате, в переменную p запишется адрес участка памяти, в котором хранится значение переменной i. Заметим, что операция & применима и к самим указателям:

char *p;

char **p2;

p2=&p;

Полное название типа переменной p2 здесь – «указатель на указатель на char».

Операция * применима к переменным типа указатель, она возвращает объект (переменную, функцию), на который ссылается данный указатель. В сочетании с операцией присваивания, она позволяет записывать некоторое значение в память или же читать некоторое значение из определённой ячейки памяти.

Пример:

char i;

char *p;

p=&i; // В переменной p теперь хранится адрес переменной i.

*p=3; // Запишем число 3 по адресу хранимому, в переменной p.

В результате выполнения этой программы, в ячейку памяти по адресу, равному адресу переменной i, запишется число 3. Т.е. выполнение этой программы просто эквивалентно записи числа 3 в переменную i.

Аналогично производится чтение памяти:

char i, j;

char *p;

p=&i; // В переменной p теперь хранится адрес переменной i.

j=*p; // В переменную j записываем значение ячейки памяти

// по адресу p.

Выполнение этой программы эквивалентно записи значения переменной i в переменную j.

Тип объекта, возвращаемого операцией *, тождественен типу, на который указывает указатель.. Это значит, что если указатель p имеет тип char* (как в примере), то операция *p вернёт переменную типа char. Если же он имел бы тип int*, то результатом *p явилась бы переменная типа int, содержащая в себе значение типа int.

Не следует путать операцию * и символ * в объявлении типа переменной, как показано в примерах выше, это 2 разные вещи. Синтаксис языка C при объявлении типа указатель иногда сбивает с толку, например объявление:

char c,*p;

создаст 2 переменные – c типа «char» и p типа «указатель на char». Тем не менее, это выражение всё равно остаётся объявлением переменной, к операции косвенной адресации символ <*> здесь никакого отношения не имеет.

Операция [] аналогична операции * и позволяет читать значения из памяти или записывать значения в память. Отличие состоит в том, что с её помощью сразу можно задавать смещение на i позиций, т.е. запись i=p[3]; эквивалентна записи i=*(p+3); (про применение операций + и – к указателям смотрите ниже).