Hi Stefan,
das Mißverständnis, was in fast allen C/C++ - Büchern auftritt, ist wohl, daß man nicht streng zwischen den Datentyp Zeiger und Adresse unterscheiden kann.
Ich benutze die Definition, daß ein Zeiger ein Datentyp ist (also eine Adresse, die auf einen bestimmten Typ zeigt).
Variablen, die diesen Datentyp enthalten nenne ich Zeigervariablen.
Ein Feldname wird während des Compilierens automatisch durch
die Startadresse des Feldes ersetzt.
Deshalb ist es ja auch eine Zeiger konstante und keine Zeigervariable. Man könnte z.B. durch #define z ((int*) 0xffff0000) eine solche Art Zeigerkonstante definieren.
Probier doch mal bitte in 2 Dateien eines
Projektes folgende globale Definition/Deklaration:
Datei 1:
int a[10];
Datei 2:
extern int *a;
Damit dürfte dann auch die angebliche Gleichheit
von Feldnamen und Zeigern widerlegt sein 
Das zeigt nach obiger Definition, daß Konstanten und Variablen nicht dasselbe sind.
*(a+i) wäre natürlich schlechter Programmierstil.
Wieso? Es ist doch völlig egal, wie du das schreibst:
a[5] = *(a+5) = *(5+a) = 5[a]
Natürlich ist es egal. Wenn man aber in einem Entwicklungsteam arbeitet, wobei die Sourcen offengelegt werden, müssen gewisse Regeln (zB ungarische Notation u.a.) eingehalten werden, um nicht geteert und gefedert zu werden.
Ach, ich liebe C/C++. Die Sprache ist so was von logisch 
dito
Gruß Frank