Бинарные аддитивные операторы +
и -
может быть использован, когда один аргумент является указателем любого полного типа (скажем, 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
.
'strlen()' фактически возвращает 'size_t', а не' int'. Одно из важных отличий заключается в том, что 'size_t' является неподписанным типом, т. Е. Он может содержать только положительные числа. Это имеет смысл - длина строк может быть 0, 1 или 30000 символов, но никогда -7. – MSalters