Вы можете рассчитывать на поведение в своем первом примере кода.
Я предполагаю, что это работает, потому что это
переводится в & * (+ 1), а затем &
и * отменяем друг друга, но могу ли я
рассчитывать на это, или это компилятор
конкретный? то есть делает ли стандарт
есть что сказать по этому поводу?
a[1]
совпадает с *(a + 1)
, а &a[1]
совпадает с &(*(a + 1))
, что дает вам указатель (&
) на (разыменованный, *
) int в a + 1
, Это четко определенное поведение, на которое вы можете рассчитывать.
int *address_of_second = a+1
Это читабельно, но, на мой взгляд, не так хорошо, как &a[1]
. &a[1]
явно показывает, что a
является указателем, что вы ссылаетесь на смещение этого указателя и что вы получаете указатель на это смещение. a + 1
немного более двусмысленно в том смысле, что фактическая строка ничего не говорит вам о том, что такое a
(вы можете вывести , что это указатель, но, насколько вы знаете из этого фрагмента, a
может быть просто int
).
Несмотря на это, это только мое мнение. Вы можете сами принимать решения в отношении стиля, если понимаете, что за кадром они одинаковы на самом низком уровне.