Проще говоря, x
, являющийся lvalue для массива типа int [5]
, означает, что он может неявно затухать до указателя на первый элемент при использовании в таком выражении, поэтому в некотором смысле код выполняет ту же функцию как &x[2] - &x[0]
будет.
Вы можете узнать больше о распаде указателя массива здесь . Обратите внимание, что это также, например, то, как, например, оператор нижнего индекса работает, поскольку его определение a[b]
идентично *(a + b)
, в этом случае a
будет распадаться на указатель на первый элемент и через арифметику указателей с b
end указывающий на нужный элемент, на который нужно разыменовать.