21.11.2013 Aufrufe

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<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 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 65/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!