Операции с указателями

 

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).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: