Pointer ein Typ?
-
Hallo,
ich habe ein seltsame frage vielleicht:
IST ein Pointer ein Typ?
Eigentlich an sich nicht oder?Ein Pointer HAT nur einen Typ oder?
Also eine Referenz auf ein Datum das einen speziellen typ hat oder?
-
ein pointer ist ein typ. er hat, wenn man dereferenziert, einen anderen.
-
hmmm - dann versteh ich jetzt eigentlich eher weniger als vorher.
Bitte nicht böse sein aber ich versuch mal laut zu denken und bitte dass ihr da nachhackt wo ich fehler mache:
Ein Typ ist doch z.B. char, int, float, bzw. das sind die Grunddatentypen oder?
Und wenn ich jetzt habe:int b = 9;
int *a = b;dann habe ich doch einen Pointer a auf b und somit 9. Also eine Referenz die auf ein int im speicher zeigt.
Wie kann denn eine Referenz ein Typ sein?
Wenn ein Pointer ein typ ist - was für ein typ ist er dann? Er hat doch nur den typ auf den er zeigt.
Oder ist es so dass ein pointer IMMER dieselbe größe im speicher hat und damit ist gemeint dass er ein typ ist? Und erst bei der dereferenzierung bekommt ein datum einen speziell großen typen?
Bzw. was ist ein typ überhaupt

-
gast_xy schrieb:
int b = 9;
int *a = b;Das müsste so heissen, denn du weist a die Adresse von b zu:
int b = 9; int *a = &b;gast_xy schrieb:
dann habe ich doch einen Pointer a auf b und somit 9. Also eine Referenz die auf ein int im speicher zeigt.
Nein, eben keine Referenz, sondern ein Zeiger. Referenzen sind zwar ähnlich, aber es gibt doch einige Unterschiede. Such dazu mal im Forum.
gast_xy schrieb:
Wie kann denn eine Referenz ein Typ sein?
Eine Referenz (kein Zeiger) ist immer nur ein Alias, also ein anderer Name für eine Variable. Sie besitzt den gleichen Typen wie die referenzierte Variable.
gast_xy schrieb:
Wenn ein Pointer ein typ ist - was für ein typ ist er dann? Er hat doch nur den typ auf den er zeigt.
Er hat nicht den Typen seines Wertes, sondern den Typen eines Zeigers auf seinen Wert.
int a; // a ist eine Variable vom Typ int int *b; // b ist eine Variable vom Typ int*, also ein Zeiger auf intgast_xy schrieb:
Oder ist es so dass ein pointer IMMER dieselbe größe im speicher hat und damit ist gemeint dass er ein typ ist? Und erst bei der dereferenzierung bekommt ein datum einen speziell großen typen?
Der Zeiger selbst wird ja durch die Adresse repräsentiert. Und diese Adresse hat immer die gleiche Grösse (normalerweise 32 Bit, was einem
intentspricht). Bei der Dereferenzierung bekommt die Variable die für den Typen spezifische Grösse (z.B. 1 Byte beichar).gast_xy schrieb:
Bzw. was ist ein typ überhaupt
Ein Typ gibt an, wie ein Wert (d.h. eine Bitfolge) interpretiert wird. Anders gesagt, wie man die Variable erkennen kann. Zum Beispiel
intals Ganzzahl,boolals Wahrheitswert undfloatals Fliesskommazahl.
-
also erstmal danke für die ausführliche antwort und Hilfe.
Er hat nicht den Typen seines Wertes, sondern den Typen eines Zeigers auf seinen Wert.
Eh - der Zeiger hat den Typen eines Zeigers auf seinen Wert? Also praktisch HAT ein Zeiger den Typen eines Zeigers. Somit also HAT ein Zeiger einen Typ und IST kein Typ?
Andererseits:
Ein Typ gibt an, wie ein Wert (d.h. eine Bitfolge) interpretiert wird. Anders gesagt, wie man die Variable erkennen kann. Zum Beispiel int als Ganzzahl, bool als Wahrheitswert und float als Fliesskommazahl.
da ein pointer ja interpretiert werden muss - ist er nach dieser definition ein typ oder?
Sehe ich das so richtig?:
EIn Pointer ist ein Typ vom Typ Pointer. Genau wie ein int ein Typ vom Typ int ist. Bei dereferenzierung bekommt eine variable den typ auf den der Pointer gezeigt hat - also auf den typ des datums auf den der pointer gezeigt hat.
-
ja.
-
danke
-
Sorry, dass ich mich eventuell nicht ganz klar ausgedrückt hatte.
gast_xy schrieb:
Sehe ich das so richtig?:
EIn Pointer ist ein Typ vom Typ Pointer.Im Grunde genommen stimmt das, in der Praxis wird dennoch zwischen Typen "Pointer auf int" oder "Pointer auf float" unterschieden, auch wenn beides Zeiger sind. Ein reiner Zeiger, der auf keinen Typen zeigt, wäre dann
void*.
-
Danke auch dir nexus - kein Problem - da kann schon mal ein wort daneben liegen und bringt einen aus dem konzept

-
Genau genommen muss ein Zeiger doch einen Typ haben, denn er leifert ja etwas zurück, die Adresse. Und eine Adresse hat ja Zahlen udn Buchstaben...
also im entferntesten so etwas wie ein char, oder?
-
Ein gültiger Pointer enthält einfach die Adresse einer anderen Variablen. Ob das für einen "Typ" ausreicht, weiß ich nicht.
-
also vom typ "adress"

-
Quellcode schrieb:
Genau genommen muss ein Zeiger doch einen Typ haben, denn er leifert ja etwas zurück, die Adresse. Und eine Adresse hat ja Zahlen udn Buchstaben...
also im entferntesten so etwas wie ein char, oder?Das sie Zahlen und Buchstaben hat, liegt daran, dass es ein Hexadezimalwert ist. Das heisst, nur eine Zahl. Du kannst mit
reinterpret_castdie Adresse in einen Integer umwandeln.Aber auch abgesehen davon haben Zeiger Typen, nämlich eben "Zeiger auf int" (
int*) oder "Zeiger auf float" (float*). Das sieht man auch bei der Definition von Variablen (oder der Parameterübergabe), denn da steht normalerweise:<Typ> <Variablenname>; int a; // a hat den Typen "int" int* b; // b hat den Typen "Zeiger auf int"Quellcode schrieb:
also vom typ "adress"

Nein, eben nicht.
-
ok, danke!
-
Wo ist denn das Problem?
a IST ein int und HAT den Wert 9.
b IST ein Zeiger-auf-int und HAT den Wert "Adresse von a".