Zeiger auf Array



  • huhu ihrs,
    hab grad irgendwie ein Verständnisproblem:

    int ar[10] = {};
    cout << ar << endl << &ar << endl << &ar[0];
    

    Wenn ich das nun ausfrühre, bekomm ich 3x die selbe Adresse... soweit klar, aber warum geht das dann nicht, wenn es doch dieselbe Adresse ist:

    int* pi = &ar; // Error
    

    Danke schonmal für Erklärungen



  • Adressen werden zur Laufzeit vergeben, Typsicherheit wird aber zum Kompilierzeitpunkt überprüft. Und da passt eben ein int ** nicht zu einem int *.



  • hmm verstehe gerade nicht warum die Adresse "&ar" zu einem "**" gehört,
    aber die Adresse "ar" zu einem "*" gehört ?!


  • Mod

    Dweb schrieb:

    hmm verstehe gerade nicht warum die Adresse "&ar" zu einem "**" gehört,
    aber die Adresse "ar" zu einem "*" gehört ?!

    Das ist der Array-to-Pointer-Decay. ar ist ein Array von ints. Aber bei Funktionsaufrufen verhält es sich wie ein Zeiger auf das erste Element, also hier wie ein *int. Wenn du den Adressoperator auf ar anwendest, verhält sich ar wieder wie ein Array. Entsprechend ist das dann die Adresse eines int-Arrays, also int(*)[10].

    Hoffentlich bin ich jetzt mit den ganzen * nicht durcheinandergekommen...



  • Dweb schrieb:

    hmm verstehe gerade nicht warum die Adresse "&ar" zu einem "**" gehört, aber die Adresse "ar" zu einem "*" gehört ?!

    int *p       = &ar[0]; // 1
    int *q       =  ar;    // 2
    int (*r)[10] = &ar;    // 3
    

    1: p ist ein Zeiger auf das erste Element von ar
    2: q ist ein Zeiger auf das erste Element (wegen "array-to-pointer decay")
    3: r ist ein Zeiger auf ein Array mit 10 Elementen (ar)

    Array-to-Pointer decay: In vielen Kontexten wird ein T[N] automatisch zu T* konvertiert, wobei der resultierende Zeiger auf das erste Element zeigt.

    Zu Operator-Präzedenzen: &ar[0] ist dasselbe wie &(ar[0]) , weil Postfix-Operatoren stärker binden als Präfix-Operatoren. Dementsprechend kann die Klammer um r nicht weggelassen werden, sonst wäre r ein Array aus 10 int-Zeigern.

    Gibt's dazu eigentlich schon einen FAQ-Eintrag? So'ne Frage kommt alle paar Wochen mal dran...

    SeppJ schrieb:

    Hoffentlich bin ich jetzt mit den ganzen * nicht durcheinandergekommen...

    Scheinst aber doch durcheinandergekommen zu sein. int** gibt's hier nirgendswo.

    Gruß,
    SP


  • Mod

    Sebastian Pizer schrieb:

    SeppJ schrieb:

    Hoffentlich bin ich jetzt mit den ganzen * nicht durcheinandergekommen...

    Scheinst aber doch durcheinandergekommen zu sein. int** gibt's hier nirgendswo.

    Und ich schreibe noch im gleichen Satz, dass es ein Zeiger auf ein Array sein soll 😡 . Hab's korrigiert.


Anmelden zum Antworten