JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=30332f69d7a5fcf0009645ee18fc84e6Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Arrayfrage

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
odc
Mini JLI'ler



Anmeldedatum: 01.06.2006
Beiträge: 2

Medaillen: Keine

BeitragVerfasst am: 01.06.2006, 20:45    Titel: Arrayfrage Antworten mit Zitat

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:

Code:

pFeld = Feld;


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
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 37
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 01.06.2006, 21:12    Titel: Antworten mit Zitat

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:
CPP:
feld + 3


mfg Dragon
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
odc
Mini JLI'ler



Anmeldedatum: 01.06.2006
Beiträge: 2

Medaillen: Keine

BeitragVerfasst am: 01.06.2006, 21:20    Titel: Antworten mit Zitat

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 Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2006, 22:20    Titel: Antworten mit Zitat

Vielleicht hilft das ja (oder verwirrt noch mehr). Du kannst auch
CPP:
pFeld = &Feld[0];

schreiben. Damit weißt du dem Zeiger die Adresse des ersten Feldelements (was auch die gleiche Adresse ist) zu.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
proggaholic
Junior JLI'ler


Alter: 35
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 11.06.2006, 13:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum