Операции над указателями
С указателями можно выполнять следующие операции:
-
разадресация, или косвенное обращение к объекту (*),
-
присваивание,
-
сложение с константой,
-
вычитание,
-
инкремент (++),
-
декремент (—),
-
сравнение,
-
приведение типов.
При работе с указателями часто используется операция получения адреса (&).
Операция разадресации или разыменования предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа):
1 2 3 4 5 |
char а; // переменная типа char char *р = new char; /* выделение памяти под указатель и под динамическую переменную типа char */ *р = 'Ю'; а = *р; // присваивание значения обеим переменным |
Как видно из примера, конструкцию *имя_указателя
можно использовать в левой части оператора присваивания, так как она является L-значением, то есть определяет адрес области памяти. Для простоты эту конструкцию можно считать именем переменной, на которую ссылается указатель. С ней допустимы все действия, определенные для величин соответствующего типа (если указатель инициализирован). На одну и ту же область памяти может ссылаться несколько указателей различного типа. Примененная к ним операция разадресации даст разные результаты.
При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей, кроме void
*. Указатель может неявно преобразовываться в значение типа bool
(например, в выражении условного оператора), при этом ненулевой указатель преобразуется в true
, а нулевой в false
.
Присваивание без явного приведения типов допускается в двух случаях:
-
указателям типа void*;
-
если тип указателей справа и слева от операции присваивания один и тот же.
Таким образом, неявное преобразование выполняется только к типу void*. Значение 0 неявно преобразуется к указателю на любой тип. Присваивание указателей на объекты указателям на функции (и наоборот) недопустимо. Запрещено и присваивать значения указателям-константам, впрочем, как и константам любого типа (присваивать значения указателям на константу и переменным, на которые ссылается указатель-константа, допускается).