Ответ 1
Да, C99 имеет специальную формулировку, чтобы сказать, что при работе с адресами любой данный объект a
будет действовать как массив из 1 элемента, так что &a+1
будет действительным (§6.5.6/7):
Для этих операторов указатель на объект, который не является элементом массив ведет себя так же, как указатель на первый элемент массива длиной один с тип объекта как его тип элемента.
Хотя номер раздела отличается (§6.3.6), C90 дает такое же требование.
С++ имеет то же требование в §5.7/4 (тот же номер раздела в С++ 03 и С++ 11).
В С++ вы можете сравнивать адреса произвольных объектов (одного и того же типа) с помощью std::less
, даже если встроенный оператор <
не даст значимых результатов (например, два объекта, которые не являются частями одного и того же массив) (§20.8.5/7):
Для шаблонов
greater
,less
,greater_equal
иless_equal
специализации для любого типа указателя дают полный порядок, даже если встроенные операторы <, > , < =, >= do not.
Также обратите внимание, что хотя вы можете сформировать эти адреса и можете сравнивать их с адресом объекта, вы не можете разыменовать эти указатели (ну, компилятор, вероятно, не остановит вас, если вы попытаетесь, но результат будет undefined).