Forum: Mikrocontroller und Digitale Elektronik Pointer void


von Hans (Gast)


Lesenswert?

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

von Maria (Gast)


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

...also wenn der Pointer als

char *ptr;

definiert worden ist !

von Sven P. (Gast)


Lesenswert?

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.

von hatschi (Gast)


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

eyyy...danke für Deine sinnlose Antwort !
..genau wie diese hier...

THX

von Maria (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.