Разыменовывать такой указатель не разрешается , даже если он сравнивается с другим действительным указателем.
Раздел 6.5.6p8 относительно оператора +
утверждает:
Когда выражение с целочисленным типом добавляется к указателю или вычитается из него, результат имеет тип операнда указателя. Если операнд-указатель указывает на элемент объекта массива, а массив достаточно велик, результат указывает на смещение элемента от исходного элемента, так что разность индексов результирующего и исходного элементов массива равна целочисленному выражению. Другими словами, если выражение P
указывает на i-й элемент объекта массива, выражения (P)+N
(эквивалентно N+(P)
) и (P)-N
(где N
имеет значение n ) указывают, соответственно, на i + n -й и i-n -й элементы объекта массива, если они существуют. Более того, если выражение P
указывает на последний элемент объекта массива, выражение (P)+1
указывает на один за последним элементом объекта массива, и если выражение Q
указывает на один за последним элементом массива объект, выражение (Q)-1
указывает на последний элемент объекта массива. Если и операнд-указатель, и результат указывают на элементы одного и того же объекта массива или один за последним элементом объекта массива, оценка не должна вызывать переполнения; в противном случае поведение не определено. Если результат указывает на один за последним элементом объекта массива, он не должен использоваться в качестве операнда унарного оператора *
, который вычисляется
В связанных обратите внимание, что в некоторых компиляторах используется концепция происхождения указателя , что означает, что он внутренне отслеживает источник указателя. Следствием этого является то, что если две несвязанные переменные являются смежными в памяти, сравнение адреса одной с адресом другой всегда будет иметь значение false, даже если адреса совпадают.