Под адресной арифметикой понимаются арифметические действия над указателями.
Сравнение двух указателей любой из операций отношения имеет смысл только в том случае, если оба указателя адресуют общий для них объект, например, строку или массив.
Если к указателю применяется операция увеличения ++ или уменьшения --, то значение указателя увеличивается или уменьшается на размер объекта, который он адресует:
Одним из операндов операции сложения может быть указатель, а другим операндом обязательно должно быть выражение целого типа. Операция сложения вырабатывает адрес, который определяется следующим образом: (адрес в указателе) + (значение int_выражения)*sizeof(<тип>), где <тип> это тип данных, на которые ссылается указатель.
Левым операндом операции вычитания должен быть указатель, а правым должно быть выражение целого типа. Операция вычитания вырабатывает адрес, который определяется так: (адрес в указателе) - (значение int_выражения)*sizeof(<тип>).
К указателям можно применять только описанные операции и операции, которые выражаются через них, например, разрешается к указателю применить операцию uk += n; , так как ее можно выразить через uk = uk+n;
Указатель может индексироваться применением к нему операции индексации, обозначаемой в Си квадратными скобками [ ]. Индексация указателя имеет вид <указатель>[<индекс>], где <индекс> записывается целочисленным выражением.
Возвращаемым значением операции индексации является данное, находящееся по адресу, смещенному в бóльшую или меньшую сторону относительно адреса, содержащегося в указателе в момент применения операции. Этот адрес определяется так: (адрес в указателе) + (значение <индекс>) * sizeof(<тип>), где <тип> -- это тип указателя.
Из этого адреса извлекается или в этот адрес посылается, в зависимости от контекста применения операции, значение, тип которого интерпретируется в соответствии с типом указателя. Рассмотрим следующий пример:
Операция индексации не изменяет значение самого указателя, к которому она применялась.