&arr[1] and arr + 1 (and &1[arr] !) are identical, and everyone computes the same pointer. According to standard C, Β§6.5.3.2 :
Unary and the operator gives the address of its operand ....
... if the operand is the result of the operator [], neither the operator nor the unary *, which is implied by [], are evaluated, and the result looks as if the operator had been deleted and [] the operator was replaced by the + operator.
Thus, for the specification &arr[1] it should be evaluated as if it were written by arr + 1 .
Using one over the other often comes down to preference. Personally, I like to use &arr[x] when I want to point to this element and arr + x when I want to refer to an array starting with x .
source share