C++ Zeiger



  • [quote="Schoasch"]Hey, danke für eure Antworten 🙂
    Das mit den Zeigern hab ich jetzt verstanden aber das:

    Hier bei Irrlicht muss die Zeigervariable ja 1 betragen, aber warum?

    Und dann noch ne Kleinigkeit..

    int* zeiger = &variable; //Einen Zeiger definieren der auf die Adresse von "variable" zeigt...
    

    Warum ist vor "variable" so ein & Zeichen?

    mfg
    Schoasch

    Das ist der &-Adressoperator, also die Speicheradresse...


  • Administrator

    @Schoasch,
    Ehm, ich dachte du seist kein Anfänger? Weisst aber nicht was Zeiger sind, Adressoperator, Funktionen oder eine if Anweisung ohne geschweifte Klammern. Tut mir Leid, wenn ich da ein wenig schmunzeln muss und das Lachen nur knapp unterdrücken kann 🙂
    Also ist wirklich nicht böse gemeint, aber damit bist du in meinen Augen definitiv immer noch ein Anfänger 😉

    Schoasch schrieb:

    IrrlichtDevice *device =createDevice(video::EDT_SOFTWARE,dimension2d<s32>(640, 480), 16,false, false, false, 0);
    

    Hier ist ja *device die Zeigervariable. Da sie aber auf CreateDevice() zeigt, ist es kein Nullzeiger oder?

    Nein, createDevice ist eine Funktion, welche einen Zeiger auf ein IrrlichtDevice Objekt zurückgibt. device ist somit ein Zeiger auf ein IrrlichtDevice Objekt.

    Schoasch schrieb:

    Wenn der Befehl (createDevice()) aber nicht ausgeführt werden konnte, dann wird 0 zurückgegeben, und daher ist die variable ein Nullzeiger, richtig?

    Auch wieder falsch. Es geht wahrscheinlich darum, wenn die Funktion das IrrlichtDevice Objekt nicht erstellen konnte, dann wird ein Nullzeiger zurückgegeben. Das ist also ein Fehlerfall. Die Funktion wird immer ausgeführt.

    Schoasch schrieb:

    Und durch...

    if (!device)
    		return 1;
    

    ...wird dann geprüft ob device 0 ist.

    Das ist richtig. Wobei ich nicht 0 sagen würde, sondern Nullzeiger. Ist einfach klarer, was man meint 😉

    Schoasch schrieb:

    Btw. warum ist im letzten code der if() Befehl ohne {} Klammern?

    Weil dies möglich ist, da die Anweisung bis zum nächsten Semikolon gilt. Ein wenig anschaulicher dargestellt:

    if(!device) return 1;
    

    Nur wenn man einen Block an Befehlen ausführen lassen will, braucht man geschweifte Klammern. Allerdings nehme ich sogar für eine einzelne Anweisung bei einer if-Anweisung geschweifte Klammer, um die Übersicht zu verbessern.

    Schoasch schrieb:

    Warum ist vor "variable" so ein & Zeichen?

    Dies ist der Address-Of Operator. Er holt die Adresse, also den Zeiger, der entsprechenden Variable.

    Grüssli



  • Schoasch schrieb:

    IrrlichtDevice *device =createDevice(video::EDT_SOFTWARE,dimension2d<s32>(640, 480), 16,false, false, false, 0);
    

    Hier ist ja *device die Zeigervariable. Da sie aber auf CreateDevice() zeigt, ist es kein Nullzeiger oder?
    Wenn der Befehl (createDevice()) aber nicht ausgeführt werden konnte, dann wird 0 zurückgegeben, und daher ist die variable ein Nullzeiger, richtig?

    CreateDevice gibt einfach einen Zeiger zurück. Das kann ein gültiger Zeiger (respektive ein Zeiger, der auf ein Objekt zeigt), oder einer, der nicht gültig ist, was dann einfach 0 ist. (Beachte hier aber, dass es nicht so etwas, wie NULL ist, wie in anderen Sprachen, sondern einfach ein gültiger Wert, der einfach anderst interpretiert werden muss). CreateDevice wird auf jeden Fall "richtig" ausgeführt, kann aber unter Umständen 0 zurückgeben (ich gehe jetzt einfach mal davon aus, dass das so ist..) , was signalisieren soll, dass ein Fehler passiert ist.

    Und durch...

    if (!device)
    		return 1;
    

    ...wird dann geprüft ob device 0 ist. Bitte korrigiert mich wenn ich das falsch verstanden habe. Btw. warum ist im letzten code der if() Befehl ohne {} Klammern?

    if () ruft immer nur den nächsten Block an Code auf, was entweder eine Zeile ist, oder eine Sammlung von Anweisungen, wass durch die Klammern gemacht wird.

    Und dann noch ne Kleinigkeit..

    int* zeiger = &variable; //Einen Zeiger definieren der auf die Adresse von "variable" zeigt...
    

    Warum ist vor "variable" so ein & Zeichen?

    mfg
    Schoasch

    & ist ein Operator, welcher dir im Normalfall die Addresse der Variable zurückgibt. Jedoch lässt sich dieser Operator, wie die meisten auch überladen und könnte etwas anderes tun, als die Addresse zurückzugeben. (z.B bei einem Smart Pointer)

    EDIT:
    Mist.. Das waren ja 2 Seiten.. -.-



  • Hey, danke für eure Antworten 🙂

    Den & Operator braucht man aber außer bei Zeigern nicht, oder?

    CreateDevice gibt einfach einen Zeiger zurück. Das kann ein gültiger Zeiger (respektive ein Zeiger, der auf ein Objekt zeigt), oder einer, der nicht gültig ist, was dann einfach 0 ist. (Beachte hier aber, dass es nicht so etwas, wie NULL ist, wie in anderen Sprachen, sondern einfach ein gültiger Wert, der einfach anderst interpretiert werden muss). CreateDevice wird auf jeden Fall "richtig" ausgeführt, kann aber unter Umständen 0 zurückgeben (ich gehe jetzt einfach mal davon aus, dass das so ist..) , was signalisieren soll, dass ein Fehler passiert ist.

    Ist IrrlichtDevice denn vergleichbar mit Variablentypen? Denn der Zeiger wurde ja vorher nicht definiert (z.B. als int).
    Und hier beim nächsten Code:

    device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    

    steht device->... was heißt das?
    Sry für meine blöden Fragen , aber ich als ehemaliger BB prorammierer, komme von dem alten Prinzip nur schwer los, da sagt man zum Beispiel: mesh = LoadMesh(), wobei mesh eine Variable ist und den Wert von LoadMesh zurückliefert..
    mfg
    Schoasch



  • Üblicherweise wird der &-Operator lediglich in Zusammenhang mit Zeigern gebraucht ja.

    Doch device wird deklariert:

    IrrlichtDevice *device =createDevice(video::EDT_SOFTWARE,dimension2d<s32>(640, 480), 16,false, false, false, 0);
    

    und ist vom Typ IrrlichtDevice, was eine Klasse ist.



  • Danke für deine Antwort 🙂

    Aber wird durch device-> einfach nur ein weiterer Wert über den Zeiger an die Klasse IrrlichtDevice übergeben?

    mfg
    Schoasch



  • IrrlichtDevice *device = createDevice( ... );
    

    device ist ein Zeiger auf ein Irrlicht-Objekt.
    *device ist das Objekt hinter dem Zeiger.

    device->doSomething();
    

    ist kurz für

    (*device).doSomething();
    

    und das solltest du ja kennen.

    Und schaff dir bitte ein ordentliches Grundlagenbuch an. Wenn du aus den paar Kommentaren schlau geworden bist, sagt das nix gutes über dein Buch (oder deine non-digitalen Lesefähigkeiten ;)) aus.


  • Administrator

    Schoasch schrieb:

    Den & Operator braucht man aber außer bei Zeigern nicht, oder?

    Doch.

    int x = 2342;
    int y = x & 1; // Bitwise AND
    
    int& r = x; // Reference
    
    int* p = &x; // Address-Of
    

    Schoasch schrieb:

    Ist IrrlichtDevice denn vergleichbar mit Variablentypen? Denn der Zeiger wurde ja vorher nicht definiert (z.B. als int).

    IrrlichtDevice ist eine Klasse, welche irgendwo definiert wurde.
    IrrlichtDevice* (der zusätzliche Stern) bedeutet, dass man einen Zeiger auf ein IrrlichtDevice Objekt möchte.
    IrrlichtDevice** bedeutet, dass man einen Zeiger auf einen Zeiger auf ein IrrlichtDevice Objekt möchte.
    IrrlichtDevice*** bedeutet, dass man einen Zeiger auf einen Zeiger auf einen Zeiger usw. 😉

    Schoasch schrieb:

    device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    

    steht device->... was heißt das?

    Das ist der operator -> . Erbedeutet das gleiche wie:
    (*device).
    Also das Objekt wird dereferenziert und danach wird auf ein entsprechendes Element des Objekts zugegriffen. In diesem Fall ist es die setWindowCaption Funktion.

    Aber ganz ehrlich, das sind absolute Grundlagen. Das findest du in jedem vernünftigen Grundlagenbuch. Es gibt wirklich genügend Lektüre ...

    Grüssli



  • Danke für eure Antworten 🙂

    Aber was bringt sich das wenn man sagt IrrlichtDevice *device = CreateDevice()?
    Viel einfacher wäre es doch zu schrieben IrrlichtDevice.CreateDevice();
    Denn CreateDevice ist doch eine Funktion von der Klasse IrrlichtDevice, und gibt daher auch einen Wert zurück, mit dem man dann überprüfen kann, ob CreateDevice() erfolgreich ausgeführt wurde.
    Macht man die Zeigervariable nur aus Faulheitsgründen, um nicht immer z.B. IrrlichtDevice.setWindowCaption(), sonder nur (*device).setWindowCaption() schreiben zu müssen?

    mfg
    Schoasch


  • Administrator

    Schoasch schrieb:

    Denn CreateDevice ist doch eine Funktion von der Klasse IrrlichtDevice, ...

    HALLOOOO?
    Tipp: Lern zuerst mal C++ ...

    Es tut mir leid, aber darauf fällt mir echt nichts anderes mehr ein. Du weisst anscheinend nicht einmal was eine freie Funktion ist. Kauf dir ein gutes C++ Buch, dort wirst du dann auch in aller Ruhe mit C++ Zeiger vertraut gemacht. Oft werden hier die folgenden zwei Bücher empfohlen:
    - C++ Primer
    - Thinking in C++ 1&2 (auch gratis als PDF erhältlich, nur Englisch)

    Alles andere scheint mir echt sinnlos zu sein. Dir fehlen anscheinend jegliche Art von Grundlagen, was C++ betrifft. Anderst kann ich mir deine Aussagen einfach nicht mehr erklären.

    Grüssli



  • Du weisst anscheinend nicht einmal was eine freie Funktion ist.

    Also das brauchst du mir jetzt aber wirklich nicht vorzuwerfen, zumal ich schon viele Programmiersprachen beherrsche und das selbst in C++ gut beherrsche.

    Nur weil ich mich bei diesem Bereich nicht auskenne lass ich mich nicht beleidigen. Außedem besitze ich den C++ Primer, der ist mir aber bei den meisten Stellen zu ausführlich, und das Kapitel der Zeiger habe ich gelesen, wegen den vielen Fachbegriffen aber nicht verstanden (...und nein, ich will jetzt keine dummen Anmachsprüche).

    mfg
    Schoasch



  • Schoasch schrieb:

    Nur weil ich mich bei diesem Bereich nicht auskenne lass ich mich nicht beleidigen.

    Dravere meint das nicht böse, aber du solltest wirklich Theorie anschauen, um das Verständnis zu erlangen. Memberfunktionen und freie Funktionen sind eben nicht das Gleiche.

    Schoasch schrieb:

    Außedem besitze ich den C++ Primer, der ist mir aber bei den meisten Stellen zu ausführlich, und das Kapitel der Zeiger habe ich gelesen, wegen den vielen Fachbegriffen aber nicht verstanden

    Hm, welche Fachbegriffe treten denn im Zusammenhang mit Zeigern auf? Mir fällt eigentlich nur gerade "dereferenzieren" ein, und dessen Bedeutung hat man noch schnell einmal begriffen.

    Aber vielleicht hilft dir ja dieser Artikel etwas, dort sind Zeiger recht ausführlich erklärt. Und lies vielleicht dein Kapitel im Buch als Ergänzung nochmals, das kann sicher nicht schaden.


  • Administrator

    Schoasch schrieb:

    Also das brauchst du mir jetzt aber wirklich nicht vorzuwerfen, zumal ich schon viele Programmiersprachen beherrsche und das selbst in C++ gut beherrsche.

    C++ entspricht aber nicht vielen Programmiersprachen, daher bringt es ziemlich wenig, wenn du andere Programmiersprachen beherrschst. Du musst C++ können.

    Schoasch schrieb:

    Nur weil ich mich bei diesem Bereich nicht auskenne lass ich mich nicht beleidigen.

    Ich will dich nicht beleidigen, es ist einfach eine Feststellung. Du hast ein durcheinander von Begriffen und Funktionalitäten. Es scheint, als hättest du nur mal C++ flüchtig angeschaut.

    Schoasch schrieb:

    Außedem besitze ich den C++ Primer, der ist mir aber bei den meisten Stellen zu ausführlich, und das Kapitel der Zeiger habe ich gelesen, wegen den vielen Fachbegriffen aber nicht verstanden...

    Und diese Aussage scheint mir der beste Beweis für meine Annahme zu sein. Er ist dir zu ausführlich, daher hast du wohl Dinge übersprungen und nicht richtig verstanden und bei den Zeiger bist du dann zum Beispiel nicht mehr mitgekommen.

    Die Sprache C++ ist sehr mühsam zu lernen und die Grundlagen sollte man ganz genau anschauen und nicht überspringen.

    Ich meine, wie zum Geier kommst du darauf, dass CreateDevice zur Klasse IrrlichtDevice gehören soll? Das entspricht nicht der Syntax von C++ und hat hier auch überhaupt niemand behauptet.
    Und auch deine Aussagen danach sind einfach nur ein Durcheinander. Entweder fehlen dir Grundlagen oder du hast unsere Beiträge nicht richtig gelesen.

    Grüssli



  • Schoasch schrieb:

    Also das brauchst du mir jetzt aber wirklich nicht vorzuwerfen, zumal ich schon viele Programmiersprachen beherrsche und das selbst in C++ gut beherrsche.

    Nur weil ich mich bei diesem Bereich nicht auskenne lass ich mich nicht beleidigen. ...

    Wo er Recht hat, hat er Recht. Wie kommst du z.B. auf die Zugehörigkeit der
    Funktion CreateDevice zur Klasse IrrlichtDevice? Das sind C++ Grundlagen. Ich sehe Draveres Beitrag nicht als eine Beleidigung an; aber Recht gebe ich dir: die Wahrheit kann schon ernüchternd und schmerzhaft, sozusagen beleidigend sein.
    Und ja, einen leicht piekenden Unterton kann man ihm und den anderen meiner Meinung nach aufgrund der aufgewendeten, jedoch fruchtlosen Mühe nicht verübeln.



  • Schoasch schrieb:

    Nur weil ich mich bei diesem Bereich nicht auskenne lass ich mich nicht beleidigen.

    Du kennst offensichtlich elementare Sprachelemente nicht, insofern ist es sinnlos dir die darauf aufbauende Konzepte erklären zu wollen. Du wirst sie eh nicht verstehen! Nimm deine Bücher zur Hand und arbeite das nach, und melde dich dann wieder.

    P.S. Wer im Glashaus sitzt sollte nicht mit Steinen werfen.


Anmelden zum Antworten