Адреса памяти могут быть на расстоянии десяти байтов, но это не то, как работает сложение / вычитание указателя.Используемые значения масштабируются в зависимости от размера типа данных, поэтому для двухбайтовых short
значения будут вдвое меньше, чем вы ожидаете от фактических адресов памяти (если ваш тип данных былодин байт char
, он будет работать так, как вы, вероятно, ожидаете).
Это действительно ничем не отличается от добавления pointer + 4
, которое дает вам адрес пятого элемента в массиве, не адрес пять байтов перед указателем.
Это рассматривается в разделе [expr.add]
стандарта (текст из C++17
):
Когда два указателя наэлементы одного и того же объекта массива вычитаются, тип результата - определенный целочисленной реализацией тип со знаком;этот тип должен быть того же типа, который определен как std::ptrdiff_t
в заголовке <cstddef>
(21.2).
Если выражения P
и Q
указывают соответственно на элементы x[i]
и x[j]
одного и того же объекта массива x
, выражение P - Q
имеетзначение i − j
; в противном случае поведение не определено.
Конечно, в любом случае это спорный вопрос в вашем случае, поскольку, согласно этой цитате,что вы делаете, это неопределенное поведение.Вычитание указателя не определено, если оба указателя не находятся в одном и том же массиве (или на один байт после указанного массива).