Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
17.7 Po<strong>in</strong>ter auf irgendetwas<br />
Es ist auch möglich, Zeiger zu def<strong>in</strong>ieren, <strong>die</strong> auf nichts bestimmtes zeigen, also nur e<strong>in</strong>e Adresse<br />
enthalten. Dabei ist aber nicht bekannt, was für e<strong>in</strong> Datentyp an <strong>die</strong>ser Adresse steht. Diese Zeiger<br />
werden als Zeiger auf nichts (void) def<strong>in</strong>iert:<br />
void *Po<strong>in</strong>ter;<br />
E<strong>in</strong> void-Po<strong>in</strong>ter kann nur zum Aufbewahren e<strong>in</strong>er Adresse <strong>und</strong> sonst für nichts verwendet werden.<br />
Er kann weder dereferenziert werden (*Po<strong>in</strong>ter), noch ist Po<strong>in</strong>terarithmetik (++, --, Po<strong>in</strong>ter + 4, ...)<br />
möglich. <strong>E<strong>in</strong>e</strong>m void Po<strong>in</strong>ter kann jeder beliebige andere Zeiger oder jede beliebige Adresse zugewiesen<br />
werden, <strong>und</strong> e<strong>in</strong> void-Po<strong>in</strong>ter kann jedem anderen Po<strong>in</strong>tertyp zugewiesen werden.<br />
<strong>in</strong>t a;<br />
<strong>in</strong>t *p = &a;<br />
float *fp;<br />
struct Datum* sptr;<br />
void *Po<strong>in</strong>ter = p;<br />
void *Po<strong>in</strong>ter2;<br />
<strong>in</strong>t *p2 = Po<strong>in</strong>ter; /* Ke<strong>in</strong> Problem, void* zu <strong>in</strong>t* */<br />
fp = Po<strong>in</strong>ter; /* Ke<strong>in</strong> Problem, void* zu float* */<br />
sptr = Po<strong>in</strong>ter; /* Ke<strong>in</strong> Problem, void* zu struct* */<br />
Po<strong>in</strong>ter2 = sptr; /* Ke<strong>in</strong> Problem, struct* zu void* */<br />
/* aber */<br />
fp = sptr; /* Error, nicht erlaubt */<br />
sptr = fp; /* Error, nicht erlaubt */<br />
17.8 Po<strong>in</strong>ter direkt auf bestimmte Adressen zeigen lassen.<br />
Po<strong>in</strong>ter können auch direkt auf e<strong>in</strong>e bestimmte Adresse gesetzt werden. So kann direkt auf den<br />
Speicher oder auf Hardware zugegriffen werden. Dies wird normalerweise nur für HW-Nahe Programmierung<br />
benötigt, wie bei Mikrokontrollern oder Gerätetreibern.<br />
<strong>in</strong>t *p2;<br />
p2 = (<strong>in</strong>t *) 0x1020; /* Po<strong>in</strong>ter direkt auf Adresse 1020 Hex setzen */<br />
/* Mit dem Cast wird der Wert <strong>in</strong> e<strong>in</strong>en Zeiger umgewandelt<br />
*/<br />
*P2 = 77; /* Den Wert 77 an <strong>die</strong>se Adresse schreiben */<br />
Kann auch kürzer geschrieben werden :<br />
*((<strong>in</strong>t *) 0x1020) = 77;<br />
Und mit #def<strong>in</strong>e kann das ganze lesbarer gestaltet werden:<br />
/* Steht irgenwo zu beg<strong>in</strong>n, ev.<strong>in</strong> e<strong>in</strong>er Headerdatei */<br />
#def<strong>in</strong>e AnalogAusgang *((<strong>in</strong>t *) 0x1020)<br />
/* Steht im Code bei jeden Zugriff auf den AnalogAusgang */<br />
AnalogAusgang = 77;<br />
Achtung, solche direkten Speicherzugriffe sollten nur durchgeführt werden, wenn man genau weiss<br />
was man tut, ansonsten ist der Programmabsturz oder Fehlverhalten des Systems garantiert.<br />
Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 65/147