Zeiger verstehen



  • Hallo Allerseits!

    Da ich noch ein Neuling in Sachen CPP bin, beschloss ich, das Kapitel "Zeiger" in Volkard's CPP-Kurs durchzulesen. Eine Aufgabe davon war, ein Programm zu kommentieren, welches mit Zeigern arbeitet:

    #include <iostream> 
    using std::cout;
    using std::endl;
    
    int main() 
    { 
       int a=5;// a wird 5 zugewiesen
       cout<<a<<endl;// ausgabe: 5
       int *pa=&a;// zeiger *pa initialisieren und adresse von a an *pa zuweisen
       *pa=6;// wert vom zeiger *pa (also a) in 6 ändern
       cout<<a<<endl;// ausgabe: 6, weil der wert von a in der vorherigen anweisung von 5 auf 6 geändert wurde
       a=7;// a wird 7 zugewiesen
       cout<<*pa<<endl;// wert vom zeiger *pa auslesen. ausgabe: 7
       int b=8;// b wird 8 zugewiesen
       int *pb=pa;// zeiger *pb initialisieren und wert (adresse) vom zeiger *pa, welcher wiederum die adresse der variablen a ist, an *pb zuweisen
       cout<<*pb<<endl;// ausgabe: 7
       int **ppa=&pa;// adresse des zeigers *pa dem "zeiger auf zeiger" **ppa zuweisen
       cout <<**ppa<<endl;// ausgabe: 7, weil hier 2 verweisoperatoren verwendet werden, wird der wert von a ausgegeben. *ppa wäre hier gleich &a bzw. pa
       ppa=&pb;// adresse vom zeiger *pb dem "zeiger auf zeiger" **ppa zuweisen
       cout<<**ppa<<endl;// ausgabe: 7, weil hier 2 verweisoperatoren verwendet werden, 
                         // wird der wert von a ausgegeben. einziger unterschied zur vorletzten anweisung: *ppa wäre hier gleich &a bzw. >>pb<<
       pb=&b;// pb zeigt jetzt auf b(8)
       cout<<**ppa<<endl;// dadurch, dass die adresse vom zeiger *pb an den "zeiger auf zeiger" 
                         // **ppa übergeben wurde und pb danach die adresse von b(8) zugewiesen bekam, wird 8 ausgegeben
       std::cin.get();
    }
    

    Nun meine Frage: Habe ich da etwas falsch verstanden?

    Bedanke mich für jedwede Hilfe im Voraus.

    Quelle: http://ittk.falb.at/pt/unterlagen/vcppk/zeiger.html



  • Es sieht richtig aus. Du hast nur eine komische Art Zeiger zu benennen.

    int a = 2;
    int *pa = &a; // [i]*pa[/i] ist [i]kein[/i] Zeiger, [i]pa[/i] ist ein Zeiger
    

    In der zweiten Zeile wird pa initialisiert, nicht *pa. In der Hnisicht ist die Syntax einer solchen Initialisierung leicht inkonsistent. Die linke Seite sagt: "*pa ist ein int", die rechte Seite bezieht sich aber nur auf pa.

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    int *pa = &a; // [i]*pa[/i] ist [i]kein[/i] Zeiger, [i]pa[/i] ist ein Zeiger
    

    In der zweiten Zeile wird pa initialisiert, nicht *pa. In der Hnisicht ist die Syntax einer solchen Initialisierung leicht inkonsistent. Die linke Seite sagt: "*pa ist ein int"

    Ich würde sagen: Die linke Seite sagt:
    "pa ist ein int*" - und dann ist es auch wieder konsistent. 'pa' ist ja der Bezeichner, der angelegt und initialisiert ist, nicht '*pa'.



  • @ Belli: In seinem Code steht aber

    int *pa=&a;// zeiger *pa initialisieren und adresse von a an *pa zuweisen
    

    Was nicht stimmt. Weder ist *pa ein Zeiger, noch wird die Adresse an *pa zugewiesen.

    Ich halte übrigens auch nicht viel davon, den Stern an den Bezeichner zu hängen, weil er für mich zum Typ gehört. Und gerade vorweg, Zeiger-Mehrfachdeklarationen habe ich nie, sodass das für mich kein Problem darstellt.


Anmelden zum Antworten