Pointer void

Gast #1024874
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
Gast #1024913
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.
Gast #1024925
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
Gast #1024936
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.
Gast #1024945
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.
Gast #1025049
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.