Hallo und einen guten Tag... Ich habe da mal eine Frage zu einem Pointer... Angenommen char sind in diesem Fall 8bit ! char a=5; char *ptr; ptr = 0xFF98; 1) Der Pointer zeigt nun auf Adresse 0xFF98 ? ptr = &a; 2) Der Pointer zeigt nun auf die Adresse wo die Variable a abgelegt ist ? ptr = (char *)0xFF98; 3) Das ist das gleiche wie zu 1) ? ------------------------------------------------------ void * ptr; ptr = (char *)0xFF98; ptr = (short *)0xFF98; 4) Letzteres ist nun ein 16 bit Pointer auf die Adresse 0xFF98 ? ebendo ist dies ein 32bit Pointer ... ? ptr = (int *)0xFF98; Vielen Dank für die Hilfe mfg hans
1, 2, 3 lauten ja. Ein void* ist ein Zeiger der nicht weiß auf welchen Datentyp er zeigt. Auch Zuweisungen wie bei 4 ändern daran nichts. Deshalb ist 4 falsch. Mit einem void* darf man nicht: ptr++; ptr--; *ptr = 33; a = *prt; Manche Compiler behandeln void* wie int*. Das ist aber ein grottenschlechter Stil.
mhhh..ok aber wann kann ich dann einen Typecast mit einem Pointer machen ? ptr = (short *)0xFF98; 3) geht das ? ...wenn nicht wozu brauche ich einen Typecast ? Vielen Dank
Sei mal lieber vorsichtig mit deinen Adressen. Das ist zwar in der Praxis schon alles irgendwo korrekt, aber C selbst spricht bei Zeigern nicht von Adressen. Mit sowas wie
1 | z = (short *) 123; |
veränderst du ja nicht den Typ der Adresse (also von 123), sondern von dem, was an Adresse 123 im Speicher steht. Den Datentyp des Zeigers selbst kannst du so nicht verändern, das wäre auch Schwachsinn. Überhaupt ist absolut davon abzuraten, Zeigern direkt Adressen zuzuweisen. Das sollte Systemheaderdateien vorbehalten bleiben. Letztlich weißt du ja eigentlich garnicht, ob dein Speicher z.B. überhaupt mit numerischen Adressen angesteuert wird -- es könnten ja auch zwei Nummern sein (Segment+Offset oder sowas) oder mehr.
Sei lieber mal vorsichtig mit den Antworten. Versuche besser nicht zu verstehen, was Sven sich da zurechtfriemelt. Darin stecken so viele Widersprüche, dass ich nicht wüsste, wo ich zu korrigieren anfangen soll. Bist aber auch selbst schuld, wenn du nicht im richtigen Forum fragen kannst.
Typecast, da versuche ich mal pragmatisch zu antworten. Wenn der Compiler meckert braucht man es. Richtig wichtig wird Typecast wenn man mit dem Pointer auf Daten zugreift oder arithmetische Operationen mit Pointern macht. void* ptr = 123; // das geht char c = *(char*)ptr; int i = *(int*)ptr; Ohne die Typecasts kann der Compiler nicht wissen wie viel Bytes aus dem Speicher geholt werden sollen. Er könnte es zwar implizit aus der Zuweisung zur linksseitigen Variablen erkennen aber C zwingt mit Absicht den Programmierer zum Nachdenken. Arithmetischen Operationen mit Pointern: void* ptr = 123; (char*)ptr++; // ptr ist jetzt 124 (int16_t*)ptr++; // ptr ist jetzt 126 Der Typ des Pointers definiert also die Incrementweite. Das Gleiche bei Addition/Subtraktion: void* ptr = 123; ptr = (char*)ptr + 1; // ptr ist jetzt 124 ptr = (int16_t*)ptr + 1; // ptr ist jetzt 126
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.