Großer Denkfehler mit Zeigern



  • Hallo, irgendwie habe ich glaub einen großen Denkfehler mit Zeigern, und da ich C++ jetzt doch schon etwas länger mache so ca. 6 Monate sollte ich solche "Basic's" eigentlich wissen........PANIK 😃
    Also ein Zeiger war für mich immer eine Variable in der ich eine Adresse eines bestimmten Types einer anderen Variable (int,char,float.....) aufnehmen kann, und dann über den Zeiger die Variable anzusprechen um z.B. ihren Wert zu verändern oder auszugeben. (Die Formulierung is n bissel 👎...)
    Bei der Deklaration eines Zeigers gibt man gleich noch den Typ an, was bedeutet das der jeweilige Zeiger nur Adressen vom Typ int,char..... aufnehmen kann.
    So ungefähr war mein Weltbild. Was also heißen würde.

    .....
    char a='X';
    char *pointer1(&a);
    int b=23;
    int *pointer2(&b);
    cout << *pointer1 << endl; //dereferenziert
    cout << *pointer2 << endl; //      "
    cout << pointer1 << endl; //Adresse --> FRAGE1
    cout << pointer2 << endl; //Adresse
    ......
    

    1. Warum kommt bei "pointer2" die Adresse und bei "pointer1" nicht? Das hat ja wohl irgendwas mit char zu tun? Wie komm ich den an die Adresse von "pointer1".
    Bei mir im Kopf war imm die Regel mit "" wird einer Zeiger dereferenziert und man bekommt den Inhalt der Variable von der Adresse welche der Zeiger beinhaltet. Ohne "" bekommt man die Adresse welche der Zeiger beinhaltet.
    Bei "pointer2" klappt das ja auch prima.

    Ach ja und man kann natürlich auch noch Zeiger Adressen in anderen Zeigern speichern, also:

    int *pointer1;
    int **pointer2(&pointer1);
    

    soweit so gut, so hab ich mir die Sache immer schon vorgestellt.
    Nun hab ich aber bemerkt das sowas auch möglich ist:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char *a="BLABLABLA";
        cout << a << endl;
    
        return 0;
    }
    

    Ich weiß zwar dass dass das geht, aber warum weiß ich nicht.
    2. Seit wann kann in einem Zeiger andere Dinge außer eine Adresse speichern?!!!!
    3. Wie schon gesagt meine Regel war doch --> ohne "*" bekommt man die Adresse die der Zeiger beinhaltet.
    4. Wenn ich schreibe "cout << *a << endl;", also a dereferenziere kommt nur "B", ich finde im dereferenzierten zustand sollte doch alles kommen also "BLABLABLA"...genauso wie das hier geht z.B. "cout << a[2] << endl;", bei mir würde das aber "...*a[2]..." heißen.

    So also hier dreht sich viel um "char"!!! Ich weiß zwar dass das mit dem Zeiger geht --> char *a="BLABLABLA"; und kann es natürlich auch anwenden, aber warum das geht weiß ich nicht. Und ich glaub wenn ich das einfach so stur auswendig lerne und nicht verstehe, dann bringt mir das nix....
    Ich hoffe mir kann jemand weiterhelfen, und berichtigt mich doch auch bitte bei meinem sog. "Weltbild" von Zeigern wenn das was nicht stimmen sollte. (was ich jetzt aber mal nicht hoffe)
    Dankeschön schon mal im Voraus.



  • Stromberg schrieb:

    1. Warum kommt bei "pointer2" die Adresse und bei "pointer1" nicht?

    Weil std::ostream cout einen Ausgabeoperator "<<" hat, der mit einen char* geeignet umgeht. Sowas bezeichnet nämlich meistens einen "C"-String. (!)
    Es würde mich wundern wenn an der Stelle nicht Müll auf dem Bildschirm ausgegeben würde; Dein char* ist nämlich per-se nicht null-terminiert ist.
    ?!?


Anmelden zum Antworten