1) Разыменования (разадресации).
Предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа).
2) Присваивания.
Заполняет область памяти некоторым значением.
Присваивание без явного приведения типов допускается:
a) Указателям типа void *;
b) Если тип указателей справа и слева от оператора присаивания один и тот же.
Пример:
char а; // переменная типа char
char * р = new char; /* выделение памяти под указатель и под динамическую переменную типа char */
*р = 'Ю'; а = *р; // присваивание значения обеим переменным
3) Получение адреса (&);
Применима к величинам, имеющим имя и размещенным в оперативной памяти. Таким образом, нельзя получить адрес скалярного выражения, неименованной константы или регистровой переменной.
Пример:
int t = 7, *p;
p = &t; //Присваиваем указателю p адрес переменной t
4) Арифметические операции:
- Автоматически учитывают размер типа величин, адресуемых указателями. Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.
|
|
a) Сложение с константой
Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа, например:
int a = 3, *p;
p = &a; // p = 012FFC04
p += 5; // p = 012FFC18 5*4(размер int) = 2010 = 1416
cout << “p = “<<*p; // Вывод: p = 1;
b) Инкремент - перемещает указатель к следующему элементу массива,
c) Декремент – перемещает указатель к предыдущему элементу массиву.
Фактически значение указателя изменяется на величину sizeof(тип).
Пример:
short * р = new short [5];
p++; // значение р увеличивается на 2
long * q = new long [5];
q ++;// значение q увеличивается на 4
d) Разность двух указателей — это разность их значений, деленная на размер типа в байтах (в применении к массивам разность указателей, например: a[6] – a[3] = 3). Суммирование двух указателей не допускается.
5) Сравнение.
Пример:
int a = 4, b = 6, *p1, *p2;
p1 = &a;
p2 = &b;
if (p1 > p2) cout << p1; //Сравниваются адреса
else cout << p2;
При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей кроме void *.
Указатель неявно может преобразоваться в тип bool (ненулевой указатель – true, нулевой – false).