Как работает &0[hello]?

Рейтинг: 7Ответов: 3Опубликовано: 08.04.2011

Нашел в поддерживаемом коде пример обращения к массиву n[a], где n - индекс, а a - массив. В простом примере выглядит как

#include <stdio.h>

void main() {
    char hello[] = "hello";

    puts(&0[hello]);
}

Вот эта строчка &0[hello] - что она значит?!

Ответы

▲ 11Принят

Стандарт C явно разрешает такую адресацию.

6.5.2.1 Array subscripting

<...>
A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object.
The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
<...>

Для чего это сделано сказать сложно. Скорее всего, хотели максимально упростить адресацию, соответственно, не стали городить сложных структур и определили операцию получения элемента массива как разыменование суммы. Поскольку «плюсик» коммутативен, как следствие желания упростить, получился такой курьёз.

Я не могу придумать ни одного случая, когда был бы оправдан подобный «переворот» операндов.

▲ 4

насколько помню, это эквивалентно &hello[0]. просто кто-то выпендрился. это передача адреса 0-ого элемента массива (строки char) в функцию puts. далее по референсу:

int puts ( const char * str );

Write string to stdout Writes the C string pointed by str to stdout and appends a newline character.

▲ 3

Просто адрес элемента вычисляется сложением индекса и адреса первого элемента.

Си допускает подобный синтаксис. UPD: стёр фигню.