Двоичные аддитивные операторы +
и -
могут использоваться, когда один аргумент является указателем на любой полный тип (скажем, T* p
), а другой аргумент является целым числом (скажем, i
). Они реализуют так называемую арифметику указателей .
Компилятор предполагает, что указатель указывает на элемент некоторого массива (скажем, T array[N]
). Операция создает указатель на другой элемент массива, который находится на расстоянии i
элементов от исходного элемента. Можно «переместить» указатель в любом направлении, то есть к началу массива или к концу массива. Например, если p
указывает на array[3]
, то p + 4
будет указывать на array[7]
.
Операция действительна только тогда, когда результат указывает на существующий элемент массива или один за последним элементом массива, т. Е. С учетом массива T array[N]
, можно создавать указатели на элементы от array[0]
до мнимый элемент array[N]
. Любые попытки пересечь эти границы с использованием арифметики указателей приводят к неопределенному поведению.
Тип T
должен быть полным, это означает, что арифметику указателей нельзя использовать с указателями void *
, например, даже если некоторые компиляторы допускают это как расширение (обрабатывая указатели void *
как эквивалентные char *
указатели).
В дополнение к бинарным аддитивным операторам, арифметика указателей также включает префиксные и постфиксные унарные операторы ++
и --
(применяемые к указателям), а также составные операторы присваивания +=
и -=
(с указателями на их слева и целые числа справа).
В вашем случае выражение str + strlen(str)
создаст указатель типа char *
, который указывает на завершающий символ \0
в строке str
.