Арифметические операции с указателями в С++
Cложение с константой, вычитание, инкремент и декремент автоматически учитывают размер типа величин, адресуемых указателями. Эти операции применимы только к указателям одного типа и имеют смысл при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.
Инкремент перемещает указатель к следующему элементу массива, декремент - к предыдущему. Фактически значение указателя изменяется на величину sizeof (тип).
Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа.
Пример.
Разность двух указателей — это разность их значений, деленная на размер типа в байтах (в применении к массивам разность указателей, например, на третий и шестой элементы равна 3).
Важно. Суммирование двух указателей не допускается.
При записи выражений с указателями надо учитывать приоритеты операций. В качестве примера рассмотрим последовательность действий, в операторе
То же самое можно записать подробнее:
Замечание. Унарная операция получения адреса & применима к величинам, имеющим имя и размещенным в оперативной памяти. Таким образом, нельзя получить адрес скалярного выражения, не именованной константы или регистровой переменной.
Инкремент перемещает указатель к следующему элементу массива, декремент - к предыдущему. Фактически значение указателя изменяется на величину sizeof (тип).
Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа.
Пример.
short * р = new short [ 5 ] ; p++; // значение р увеличивается на 2 long * q = new long [ 5 ] ; q++; // значение q увеличивается на 4
Важно. Суммирование двух указателей не допускается.
При записи выражений с указателями надо учитывать приоритеты операций. В качестве примера рассмотрим последовательность действий, в операторе
*р++ = 10;Операции разадресации и инкремента имеют одинаковый приоритет и выполняются справа налево, но, поскольку инкремент постфиксный, он выполняется после выполнения операции присваивания. Таким образом, сначала по адресу, записанному в указателе р, будет записано значение 10, а затем указатель будет увеличен на количество байт, соответствующее его типу.
То же самое можно записать подробнее:
*р = 10; p++;Выражение
(*р)++;наоборот, инкрементирует значение, на которое ссылается указатель.
Замечание. Унарная операция получения адреса & применима к величинам, имеющим имя и размещенным в оперативной памяти. Таким образом, нельзя получить адрес скалярного выражения, не именованной константы или регистровой переменной.