Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gos_YPMT_1.DOC
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
101.89 Кб
Скачать

7 Адреса, указатели, ссылки. Адресная арифметика.

Постоянные и переменные адреса

Операции над адресами &, *, []

Пустой адрес NULL

Адресная арифметика +, -

Отличия указателей и массивов

Отличия указателей и ссылок

Все объекты программы хранятся в оперативной памяти по некоторым адресам, т.е. в специальной таблице, которую строит компилятор и заполняет загрузчик, записаны имена или обозначения объектов и адреса памяти, где они размещены. Кроме имен к объектам можно обращаться через специальные объекты, которые могут адресовать другие объекты – указатели (переменные типа адрес). Особенно это важно для объектов, которые не имеют имен, а память получают динамически во время выполнения программы, например, для этого могут использоваться специальные операции (new) или функции (alloc, malloc и другие).

В языке Си, кроме того, имя массива отождествляется с адресом начала, т.е. самого первого элемента (постоянный адрес). Так как массив не может быть перемещен в оперативной памяти, то его имя считается постоянным адресом, хотя значения, которые по нему хранятся, можно изменять. Указатели могут менять свои значения, т.е. могут адресовать разные участки памяти, как обычным переменным им можно присваивать новые значения.

Адреса разных типов отличаются в зависимости от адресуемых значений, хотя иногда могут быть приведены друг к другу. Для правильного выполнения операций присваивания и адресной арифметики необходимо строго соблюдать типы адресов операндов в адресных выражениях.

Описание массивов и переменных-указателей на языке Си++ может выглядеть следующим образом:

int num [20];

char * s;

Для работы с адресами используются следующие операции:

& - получить адрес объекта

* - получить доступ к значению по его адресу

[] – получить доступ к значению по его адресу и порядковому номеру элемента

-> - получить доступ к значению поля структурного объекта по его адресу и имени поля.

Базовой операцией для доступа к значению является операция *, а операции [] и -> – только производные от нее, т.е. выражение a [k] эквивалентно выражению * (a + k). В виду коммутативности операции сложения все это эквивалентно выражению k [a], что выглядит достаточно странно для многих языков программирования. Аналогично выражение a -> b эквивалентно выражению (* a) . b.

Адреса одинаковых типов можно сравнивать на равенство (равно не равно). Для обозначения пустого адреса используется универсальная константа NULL, которую можно присваивать переменным-указателям, но нельзя по пустому адресу получать доступ к значениям.

Для эффективной работы с адресами переопределены арифметические операции + и -. Разрешается к адресу некоторого типа прибавлять (вычитать) целое число. Это действие трактуется как сдвиг по адресному пространству в памяти на заданное число элементов соответствующего типа. Отрицательное значение приводит к сдвигу в сторону младших адресов. В результате получается адрес того же типа.

Кроме того, разрешается вычитать адреса одного и того же типа – в результате получается целое число – это количество элементов соответствующего типа, размещающихся между заданными адресами.

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

Использование указателей при передаче параметров в процедуры и функции эквивалентно передаче параметров по наименованию, а не по значению, но при этом в теле подпрограммы каждый раз надо с помощью операции * разыменовывать указатель для доступа к значению.

Упрощает эту работу использование другого механизма адресации – ссылок, т.е. это способ задания синонима (другого имени) для некоторого переменного объекта. При передаче параметра по ссылке это эквивалентно передаче с помощью ссылки, но разыменование выполняется автоматически.

При описании в классе конструктора копирования параметр обязательно должен передаваться по ссылке, а не другим способом.

В отличие от указателя значение ссылки, т.е. адреса, а не ссылаемого значения, изменить нельзя. Таким образом, ссылка (синоним) является постоянным адресом

16

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]