Zeiger Pointer



  • Das ist sicher auch Geschmackssache. Aber Referenzen wurden nicht zum Spaß eingebaut. Sie sind sicherer, weil man weder die Adresse, auf die die Referenz zeigt, noch die Adresse, an der die Referenz selber steht (WENN sie vom Compiler als Zeiger implementiert wird), absichtlich oder unabsichtlich manipulieren kann.
    Für Parameterübergabe ziehe ich Referenzen den Zeigern klar vor.

    Bronstein schrieb:

    Wenn das Auto jetzt ein paar Meter weiter fahr und mann dann wieder mit dem Finger draufzeigt. ändert sich dann die Speicheradresse oder der Wert

    Nein, ich finde das Beispiel/Erklärung nicht glücklich gewählt.



  • void printDouble(const double& rd)
    {
    cout << rd; // no need to test rd;
    }

    void printDouble(const double *pd)
    {
    if (pd) { // check for null pointer
    cout << *pd;
    }
    }

    effiziente Parameter-Übergabe (für Lesezwecke) macht man sicher besser mit Referenzen als mit Zeigern. Aber nur weil irgendwas bei einer Sache bequemer ist seh ich nicht ein was daran generell schöner sein soll



  • Wenn das Auto jetzt ein paar Meter weiter fahr und mann dann wieder mit dem Finger draufzeigt. ändert sich dann die Speicheradresse oder der Wert

    klingt fast so als ob das eine rhetorische Frage wär um zu zeigen, daß das Besipiel nicht so toll gewählt war 😃

    aber ich geh jetzt mal so aus, das das nicht so ist?!

    In dem Fall würd sich programmtechnisch der Wert ändern, nämlich die Auto.position. Die Adresse bleibt gleich (im Programm; der Finger müsste sich natürlich bewegen)



  • Zeiger braucht man ueberlicherweise fuer polymorphie( siehe Vererbung) ...
    (Achtung, unter polymorphie verstehe ich das man mit einer variable mehrmals Instanzen unterschiedlicher Klassen (abgeleitete) ansprechen kann. Weil, ich bin mir sicher, irgendwer schreibt sicher, das polymorphie auch mit referenzen geht ... )

    Und fuer dynamisch angelegte Objekte. Dynamische objekte brauchst wiederum, wenn die groese oder anzahl erst innerhalb der laufzeit bekannt wird, oder du groessere Variablen anlegen willst, und ueber den scope der anlegenden funktion hinaus verwenden willst ... ohne die variablen gloabl machen oder zu kopieren.



  • Was ist bei deinem Beispiel eigentlich die Speicheradress und der Wert



  • Shady schrieb:

    effiziente Parameter-Übergabe (für Lesezwecke) macht man sicher besser mit Referenzen als mit Zeigern. Aber nur weil irgendwas bei einer Sache bequemer ist seh ich nicht ein was daran generell schöner sein soll

    Ich sehe auch beim Schreiben keinen Grund dafür, Werte per Zeiger und nicht als Referenz zu übergeben. Jetzt kommt sicher gleich, weil man dann das bei der Übergabe sieht - WOW. Wenn die Funktion einen geeigneten Namen hat, erkennt man auch, dass sie die Parameter ändert und man sollte sowieso immer dokumentieren, was eine Funktion macht.
    IMO sollte man immer, wenn es möglich ist, Zeiger durch Referenzen ersetzen.



  • Optimizer schrieb:

    ..., erkennt man auch, dass sie die Parameter ändert

    man erkennt, dass eine funktion nichts ändert, wenn ihre parameter konstante referenzen sind.

    Optimizer schrieb:

    und man sollte sowieso immer dokumentieren, was eine Funktion macht.

    das sowieso 😉



  • Wie kann man die Speicheradresse um eine int Zahl erhöhen. Bitte mit kurzem Beispiel



  • int *pointer;
    pointer += 4;   // nächstes int
    

    Das sollte man genau NICHT machen. Genau DESHALB sollte man Referenzen verwenden. Wozu soll das gut sein, wenn man nicht gerade nen Grafikkartentreiber schreibt. 🙄



  • Knock knock... @Optimizer: Da gehst du aber 16 Byte weiter und nicht bloß 4. Btw. finde ich das im kleinen überschaubaren Rahmen garnicht schlimm ein wenig lowlevel zu werden. Man sollte es nur nicht übertreiben.



  • Damn, das liegt am verdammten Assembler 😃
    Also hier gehen wir natürlich 4 ints und nicht 4 Byte weiter. Und jetzt könnte man noch spitzfindig sein und sagen, dass ein int nicht auf jedem System 4 Bytes ist. 😉



  • Ich sehe auch beim Schreiben keinen Grund dafür, Werte per Zeiger und nicht als Referenz zu übergeben

    mit "für Lesezwecke" hab ich auch nicht unbedingt gemeint, daß man fürs Schreiben dann keine Referenzen nehmen sollte, sondern die Lese-Übergabe per const Referenz ist jedenfalls bei mir der typischste Ort wo ich Referenzen Zeigern vorziehe (jedenfalls wenn es sich beim Parametertyp um einen konkreten Typ wie vector<> oder string handelt).
    Was beim Schreiben von strings etc. am Besten ist, dazu sag ich mal nichts, weil ich mir da selber nicht ganz schlüssig bin. (Ich verwende meist für strings und ähnliche Klassen wie fürs Lesen Referenzen)



  • Shady schrieb:

    Frage: Wo steht Dein Auto?
    Antwort: Dort. (mit Finger auf das Auto zeigend)

    nach der Erklärung werden Newbies sicher sofort wissen was sie mit Zeigern anfangen können 😃

    Ich sprech da jetzt mal aus meiner Erfahrung, meist besteht das Problem mit den Zeigern darin, daß Neulinge ein kleines Verständnisproblem mit dem Konzept haben haben. Dafür ist die von mir gegebene Erklärung eigentlich hilfreich.



  • Optimizer schrieb:

    Damn, das liegt am verdammten Assembler 😃
    Also hier gehen wir natürlich 4 ints und nicht 4 Byte weiter. Und jetzt könnte man noch spitzfindig sein und sagen, dass ein int nicht auf jedem System 4 Bytes ist. 😉

    Also aus deinem Beispiel schließe ich, dass es auf deinem wohl so ist. 😉


Anmelden zum Antworten