www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointer void


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maria (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...also wenn der Pointer als

char *ptr;

definiert worden ist !

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: hatschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eyyy...danke für Deine sinnlose Antwort !
..genau wie diese hier...

THX

Autor: Maria (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.