Es ist ein Unterschied zwischen Semantik und Technik. Technisch gesehen ist ein Array ein linearer Speicherbereich. Zumindest unter C/C++. Und somit ist die Variable selbst technisch gesehen ein Pointer auf den Anfang des Bereichs. Eine Addition und Dereferenzierung führt also zu einem Zugriff [*(b+i)], der identisch ist zu b[ i ].
Semantisch gesehen ist ein Array aber ein Array und und kein Zeiger auf einen Speicherbereich.
Ob der &-Operator also benötigt wird oder nicht, das ist nicht die Frage. Die Frage ist, ob die Semantik verschleiert werden sollte oder nicht.
Meiner Meinung macht das hier mehr Sinn:
|
C-/C++-Quelltext
|
1
2
|
int foo[10];
int* firstElement = &foo[0];
|
Als das hier:
|
C-/C++-Quelltext
|
1
2
|
int foo[10];
int* firstElement = foo;
|
Das heißt nicht, dass ich die erste Variante persönlich auch im Code schreibe, da mir die Bedeutung des Codes klar ist.
Aber auf die Idee zu kommen eventuell ein "delete firstElement" zu machen (was böse endet) ist beim zweiten Beispiel deutlich wahrscheinlicher (für Außenstehende oder beim Überfliegen des Codes) als im ersten, da im ersten die Semantik eindeutig die Adresse des ersten Elements ist und nicht die Zuweisung eines dynamisch allozierten Speichers über Pointer.