 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
odc Mini JLI'ler
Anmeldedatum: 01.06.2006 Beiträge: 2
Medaillen: Keine
|
Verfasst am: 01.06.2006, 19:45 Titel: Arrayfrage |
|
|
Hallo allerseits,
sorry für diese n00bie-Frage, aber es interessiert mich einfach: In der 2003er-Auflage des Buches "Jetzt lerne ich DirectX" ist in Listing 7.7 auf Seite 125f eine Initialisierung eines Arrays demonstriert.
Hierbei geht es ums Prinzip: Ein Array ist eigentlich nix anderes als ein Zeiger. Schön und gut, aber in Zeile 14 wird wie folgt zugewiesen:
Was mich stutzig macht: Müsste ich nicht dem Zeiger eine Speicheradresse, also &Feld übergeben?
Ich danke im Voraus für jede Hilfe. |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 01.06.2006, 20:12 Titel: |
|
|
Hallo,
ein Feld ist ein Zeiger und daher brauchst du kein &-Operator anfügen. Auf den Speicher kannst du mit den [] zugreifen.
Folgendes Beispiel. Du hast ein Feld mit einer bestimmten Anzahl. Wenn du nun auf das 4. Element (Achtung, Index fangen bei 0 an und nicht bei 1) zugreifen willst, mach man folgendes.
CPP: | cout << feld[3] << endl; |
Das feld nur ein Zeiger ist, wird das intern so gehandhabt:
mfg Dragon _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
odc Mini JLI'ler
Anmeldedatum: 01.06.2006 Beiträge: 2
Medaillen: Keine
|
Verfasst am: 01.06.2006, 20:20 Titel: |
|
|
Vielen herzlichen Dank für die rasche Antwort!
Ich komme eigentlich aus dem Scriptingbereich und da hat man's nicht so mit Zeigern. Vielen Dank nochmals, ich denke ich hab's verstanden  |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.06.2006, 21:20 Titel: |
|
|
Vielleicht hilft das ja (oder verwirrt noch mehr). Du kannst auch
schreiben. Damit weißt du dem Zeiger die Adresse des ersten Feldelements (was auch die gleiche Adresse ist) zu. |
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 11.06.2006, 12:51 Titel: |
|
|
Zitat: |
Was mich stutzig macht: Müsste ich nicht dem Zeiger eine Speicheradresse, also &Feld übergeben?
|
Nun ja, dieser Versuch dürfte mit einem Fehler quittiert werden. Es geht natürlich nur auf die beiden genannten Arten, entweder nur der Arrayname oder der Adressoperator mitsamt dem Offsetoperator. Denn wenn der Adressoperator auf den Arraynamen ausgeführt wird (wir wissen inzwischen: Der Arrayname ist so ähnlich wie ein Zeiger), würde man (wenn der Arrayname wirklich ein Zeiger wäre) die Adresse erhalten, an der der Zeiger auf das erste Arrayelement selbst gespeichert ist (doppelte Referenzierung). Da das in der Regel aber nicht beabsichtigt sein dürfte, ist der Zeigertyp mit dem des Arrays vermutlich identisch, wovon im folgenden Beispiel ausgegangen wird:
CPP: | #include <iostream>
int main()
{
// Das Array, auf das der Zeiger referenziert werden soll
char array[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '\0' };
// Zeiger anlegen
char* ptr;
// Zeiger referenzieren...
ptr = array; // Funktioniert, Arrayname == Zeiger (naja, fast)
ptr = &array[0]; // Funktioniert, Adresse erstes Element
// ptr = &array; // ERROR
std::cout << ptr << std::endl;
return 0;
}
|
Soweit, sogut. Sollte man wirklich die dritte Variante verwenden wollen, so käme man sicher leicht in die Versuchung, folgendes zu probieren:
CPP: | char** ptr = &array;
|
Wider allen Erwartungen geht aber auch das schief, obwohl man eigentlich davon ausgegangen ist, das der Adressoperator, ausgeführt auf Zeigern, die Adresse des Zeigers selbst zurückliefert, sprich: die Adresse, wo er im Speicher steht.
Dieser Umstand legt nahe, dass der Arrayname eben _nicht_ mit einem Zeiger gleichzusetzen ist, obwohl beide sich sehr ähnlich sind und zum besseren Verständnis oft gleichgesetzt werden. Tatsächlich wird der Arrayname lediglich intern als Zeiger verwaltet, sodass man von aussen keinen Einfluss darauf hat und die Sache mit dem Adressoperator fehlschlägt, da der Compiler sich bei seiner eigenen Arrayverwaltung nur sehr ungern in die Karten schauen lässt.
Gutgut, soviel zu meinen Erfahrungswerten und zu dem, was ich gelesen und gehört habe. Sollte das da oben nicht ganz korrekt sein, bitte Berichtigung posten ;)
mfg
proggaholic |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|