Учитывая указатель m
на некоторый элемент в массиве, скажем x
, и целое число r
, m += r
корректирует m
, чтобы указывать на элемент, который является r
элементами после x
.
Например, если m
указывает на a[3]
, а r
равно 5, то m += r
меняет m
на a[8]
.
В случае где m
- это uint8_t *
, оно должно указывать на элементы, которые являются байтами, а продвижение m
на r
элементов продвигает указатель на r
байтов. В случаях, когда m
указывает на больший тип, например, когда m
равен int *
, продвижение m
на r
элементов продвигает указатель на r*s
байтов, где s
- количество байтов в каждом элементе.
Во многих реализациях C байты в памяти просто нумеруются последовательно, начиная с 0 (хотя не все байты могут быть отображены в виртуальном адресном пространстве), и указатель представлен номером байта, на который он указывает. В этом случае, чтобы увеличить указатель на n байтов, реализация C просто добавляет n к своему представлению. В реализациях C с более сложными моделями памяти реализация C выполняет любые манипуляции, необходимые для создания указателя на нужное место.