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; // ErrorDanke 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 ?!
-
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; // 31: 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
-
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.