Pointer => Verständisproblem



  • Hallo,

    ich bin es schon wieder 😕

    ich hab jetzt das komplette pointer kapitel in c++ primer durch und muss sagen das ich pointer immer noch nicht verstanden habe.

    ich mache mal ein kleines bsp

    andy = 25;
    fred = andy;
    ted = &andy; 
    beth = ted;   // beth equal to ted ( 1776 )
    beth = *ted;  // beth equal to value pointed by ted ( 25 )
    

    dieses bsp habe ich aus => http://www.cplusplus.com/doc/tutorial/pointers/

    Also mir ist klar andy wird 25 auf den speicher "1776" zugewiesen.

    Fred = andy // Ich dachte weil andy 25 ist wird Fred auch zu 25 aber auf einem anderen Speicher zB 1777.

    ted = &andy // ist also 1776 und 25 ist momentan auf 1776 gespeichert. Also ist Ted und Andy 25 un teilen sich einen speicher. Ist das richtig ?

    Nun kommt das was ich nicht verstehe

    beth = ted;   // beth equal to ted ( 1776 )
    beth = *ted;  // beth equal to value pointed by ted ( 25 )
    

    Wenn beth = ted ist, hat dann beth nicht einen anderen speicher als 1776 ? Ich dachte deshalb sind pointer so gut , da man nicht unnötig viel speicher braucht.

    anscheinend habe ich pointer überhaupt nicht verstanden.

    Kennt ihr eine Seite wo ich mir das nochmal durchlesen kann ? 😞

    tut mir leid das ich so viel frage.

    danke



  • Auch wenn du nicht dazugeschrieben hast, welchen Datentyp diese Variablen haben, ist vermutlich eine der beiden Zuweisungen zu beth ein Compilerfehler. (OK, mit nutzerdefinierten Typen und überladenen Operatoren könnte es funktionieren)



  • int i = 5; // i = 5
    int *p = &i; // p = adressevon(i)
    int **q = &p; // q = adressevon(p)
    int j = **q; // j = 5, doppelt dereferenziert.
    

    Ich dachte deshalb sind pointer so gut , da man nicht unnötig viel speicher braucht.

    Das ist zwar nicht der einzige Zweck, aber um das Beispiel hier mal auszuführen.

    void printint(int *i) // macht selten Sinn, da meist sizeof(void*) >= sizeof(int)
    { // hier kann man auch gleich (int i) schreiben und den Wert direkt übergeben. (Es sei denn, man möchte den Wert den übergebenen Variablen ändern.
      cout << *i;
    }
    
    void printIrgendEinGroßesStruct(IrgendEinGroßesStruct *p) // Hier spart man Speicherplatz.
    {
      cout << p->member1 << " " << p->member2 << ...
    }
    

    Soweit zu C, in C++ solltest du dir unbedingt auch noch Referenzen angucken. 🙂



  • ted = &andy // ist also 1776 und 25 ist momentan auf 1776 gespeichert. Also ist Ted und Andy 25 und teilen sich einen Speicher. Ist das richtig ?

    Nein, so wie ich dich verstanden habe, ist dies nicht richtig.

    Ein Zeiger teilt sich nicht den Speicherplatz mit einer anderen Variable, sondern ist eine eigenständige Variable (in 32 Bit System: 4 Byte groß) und hat als Inhalt die Adresse einer anderen Variable/Daten/etc. Damit verweist sie lediglich auf die Stelle im Arbeitsspeicher, in der die gewünschten Daten sich befinden.

    Nehmen wir als Beispiel:

    int andy = 25;
    int fred = andy;
    int* ted = &andy;
    int beth = (unsigned int)ted;
    beth = *ted;
    
    Adresse (div 4): ... 1775 1776 1777 1778 1779 ....
    Name der Variable:        andy fred ted  beth
    Wert der Variable:        25   25   1776 [b]1.[/b] 1776 [b]2.[/b] 25
    

    Verwandelst du also den Wert eines Zeigers in einen Integer, erhältst du die Adresse, auf welche der Zeiger verweist. Um auf die Daten dieser anvisierten Variablen zuzugreifen, musst du den Zeiger dereferenzieren,

    *ted
    

    .

    Du hast also keinen Speichervorteil für kleine Datentypen. Speichervorteil gibt es erst wenn du größere Mengen an Daten hast, welche du während einen Funktionsaufrufs nicht kopieren möchtest. Dann kannst du einen Zeiger übergeben, welcher lediglich 4 Byte groß ist, und damit auf die größere Menge an Daten im Speicher zugreifen.



  • ah okay danke

    super erklärt 👍

    🙂


Anmelden zum Antworten