G
name_abcd schrieb:
Aber trotzdem : Der Compiler weiß nicht 100% von wo bis wo das Array geht. Definition von Array ist eher : Ein Feld von vars im A.speicher , die alle hintereinander in sep. aufeinanderfolgenden Speicherbereichen liegen. Nach dem Anlegen gibt es das Array im Speicher nicht , sondern nur ganz normale aufeinander folgende vars. Der Compiler weiß lediglich nur die Speicheradresse des ersten "Feldelementes" . Und mit dem [] - Operator können wir von dieser Sp.adresse aus auf alle --> alle ( auch auf die , die nicht zum "Array" gehören ) vars zugreifen. Und der Compiler weiß nur anhand der Array-Deklaration : int iarray[5]; wie gross das Array ist, aber trotzdem bei Zugriffen ( z. B. über die for-Schleife ) nicht , wo das Array endet. Das ist auch logisch --> Wegen der geringen Grösse des STACKS ist Arrayname == Sp.adresse des ersten Feldelementes. Von dieser Sp.adresse aus kann man eben auf u.a. nachfolgende Sp.adresse && damit vars zugreifen. Mehr Informationen speichert der Comp. nicht. Es kann höchstens wissen wieviel Byte gross das Array ist ( anhand der Deklaration ) . Aber nicht wo das Array endet...
Du hast hier einige Verständnisprobleme. Erstmal, der Array Name ist keine Adresse. Und dafür wird auch kein extra Speicher benötigt. Dorthin kommen wir erst, wenn wir über dynamischen Speicher reden. Das soll jetzt aber nicht das Thema sein. Betrachte den Array Namen eher als Referenz auf das Array. Und bei Bedarf kann dieser in eine Adresse, welche auf den Anfang des Arrays verweist, umgewandelt werden. Ein Beispiel hierfür ist Zeigerarithmetik. Bis dahin kennt der Compiler die Dimension des Arrays, und kann, sofern das zur Übersetzungszeit möglich ist, Zugriffe auch prüfen. Wo genau das Problem mit dem "aufeinanderfolgen" liegen soll, verstehe ich allerdings nicht. Vielleicht hilft es dir ja, wenn du Nicht-Array Variablen als Array Variablen der Länge 1 betrachtest.
Zu erwähnen ist noch die Parameterübergabe bei Funktionen:
int foo(char bar[5])
Auch wenn das wie ein Array ausschaut, es wird letztendlich nicht wie eines übergeben. In der Funktion kommt einfach nur ein Zeiger an.