Naja, für den Compiler ist ein Array im Endeffekt auch nichts Anderes als ein "normaler" Pointer, nur daß in diesem Pointer eben die Basisadresse eines Arrays steht.
Umgekehrt bedeutet das, man kann den []-Operator mit jedem beliebigen Pointer verwenden, selbst dann wenn dieser eigentlich garkein Array ist (denn dem Compiler ists egal).


Nehmen wir an es gäbe den []-Operator nicht, wie würde man dann auf ein Element eines Arrays zugreifen?
Man müsste, ausgehend von der Basisadresse des Arrays und der Nummer des Elements eben die Adresse dieses Elements berechnen.

Bei 8-Bit Typen ist das sehr simpel, man muss nur die Basisadresse und die Nummer des Elements addieren, fertig ist die Adresse des Elements.

array[63] entspricht dann quasi *(array + 63)

Bei anderen Typen muss zusätzlich deren Größe berücksichtigt werden, also z.B. *(array + 63 * sizeof(uint16_t)) bei 16 Bit.



Der []-Operator sagt dem Compiler also nur, daß er - passend zum Typ des verwendeten Pointers - die Adresse eines bestimmten Elements berechnen soll.


In meinem Beispiel erzeuge ich einen uint16_t Pointer, und setze ihn auf die Basisadresse des vorhandenen uint8_t Arrays. Wenn ich dann mittels [] darauf zugreife, behandelt der Compiler diesen Pointer genauso wie ein uint16_t Array