Pointer und sein Typ
-
Hallo!
Mir ist grad ne Frage eingefallen und die wollt ich mal eben los werde3n *g*
Warum muss ein Pointer den Typ des Elements kennen auf den er zeigt?
Das es dem besseren Verständnis des Codes dient is klar, aber was spricht sonnst dafür? Ein Pointer enthält ja nur eine Speicheradresse, die immer gleich aussieht, ob bei einem Char, int, bool oder sonnstwas. Folglich hat es nichts mit speicher reservieren zu tun.Also warum?
-
er muss den typ nicht kennen.
deswegen gibt es ja void*
aber wenn du zB
++p;
schreibst - um wieviele bytes soll der zeiger dann erhöht werden?oder welchen typ liefert *p - welchen Wert hat *p (wieviel byte sollen aus dem speicher geholt werden)
-
Dem Pointer selbst isses egal, aber wenn du den Pointer dereferenzierst, also *p schreibst, muß der Compiler wissen, welchen Typ dieser Ausdruck hat.
-
Hallo,
Warum muss ein Pointer den Typ des Elements kennen auf den er zeigt?
Da verschiedene Variablentypen unterschiedlich groß sind, ist die es für den Compiler sinnvoll zu wiesen auf welchen Variablentyp er zeigt, damit er die größe bestimmen kann.
int *ptr = malloc(sizeof(int)); *ptr = 0; /* Der Compiler weiß das er sizeof(int) Bytes mit 0x00 ausfüllen muss */
und außerdem: Typsicherheit
mfg th3law
P.S.: Das was ich eben geschrieben habe ist nur eine Vermutung. Ich garantiere nicht für die Richtigkeit.
-
Stimmt, daran hadde ich grad nich gedacht.
Aber dann erklährt mir doch mal bitte das Verhalten von
void*
In meinen schlauen Büchern steht nämlich leider nix drin.
-
void* zeigt auf irgendwas, aber der Compiler weiß nicht auf was. Deshalb kann er den void-Pointer nicht dereferenzieren. Wenn du meinst, du weißt, was dahinter steckt, mußt du den Pointer erst in einen typisierten Pointer umwandeln:
/* void * p; */ int x = 25 + *(int*)p;
-
also quasi n type-cast?!
Und wo sind die Anwendungsbereiche? ein von anfangan typisierter scheint mir da doch praktischer, oder gehts da wieder um templates (oder sowas in der art)?
-
Original erstellt von THE_FreaK:
also quasi n type-cast?!
Und wo sind die Anwendungsbereiche? ein von anfangan typisierter scheint mir da doch praktischer, oder gehts da wieder um templates (oder sowas in der art)?Funktionen, die verschiedene Datenstrukturen hin- oder zurückgeben können. Die können dann einen Parameter vom Typ void * haben und ein weiterer (z.B. int-)Parameter sagt, was dieser Zeiger eigentlich bedeutet.