Q:

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

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

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

    puts(&0[hello]);
}

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

A:

Стандарт 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))).
<...>

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

A:

насколько помню, это эквивалентно &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.

A:

Просто адрес элемента вычисляется сложением индекса и адреса первого элемента.
Си допускает подобный синтаксис. UPD: стёр фигню.

