Получение адреса с использованием квадратных скобок и амперсанда - PullRequest
4 голосов
/ 31 августа 2009

Рассмотрим:

int a[2] = {0,1};
int *address_of_second = (&a[1]);

Я предполагаю, что это работает, потому что оно переведено в & * (a + 1), а затем & и * отменяют друг друга, но могу ли я рассчитывать на это, или это зависит от компилятора? То есть стандарт C может что-нибудь сказать по этому поводу?

Это достойный способ писать? Лично я считаю, что пишу:

int *address_of_second = a+1

лучше, ты согласен?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 31 августа 2009

Вы можете рассчитывать на поведение в своем первом примере кода.

Я предполагаю, что это работает, потому что это переводится в & * (+ 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).

Несмотря на это, это только мое мнение. Вы можете сами принимать решения в отношении стиля, если понимаете, что за кадром они одинаковы на самом низком уровне.

1 голос
/ 31 августа 2009

Оба работают. Мое личное предпочтение будет либо &(a[1]), либо a+1. Я предпочитаю размещение скобок в первом, потому что это очень ясно дает понять, что я беру по адресу. Я склонен использовать это в большинстве ситуаций. Если в рассматриваемом коде много арифметики с указателями, я мог бы использовать вторую форму.

1 голос
/ 31 августа 2009

это вопрос стиля или соглашения о коде, если вы работаете в группе. Обе формы совместимы с c ++ на всех соответствующих компиляторах.

Я предпочитаю первое:)

...