06.10.2013 Aufrufe

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

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.6 Po<strong>in</strong>ter <strong>und</strong> Funktionen<br />

Zeiger können auch auf Funktionen zeigen, es ist also möglich, <strong>die</strong> Adresse e<strong>in</strong>er Funktion <strong>in</strong> e<strong>in</strong>er<br />

Zeigervariablen abzuspeichern. Dies erlaubt es, zum Beispiel e<strong>in</strong>er Funktion selbst e<strong>in</strong>e Funktion<br />

als Argument zu übergeben (Callback Funktion).<br />

E<strong>in</strong> Zeiger auf e<strong>in</strong>e Funktion wird wie folgt def<strong>in</strong>iert:<br />

<strong>in</strong>t (*Fptr)(<strong>in</strong>t a, float b); /* Zeiger auf Fkt der Form <strong>in</strong>t f(<strong>in</strong>t x, float y) */<br />

Achtung, <strong>die</strong> Klammern um * <strong>und</strong> den Funktionsnamen s<strong>in</strong>d nötig, sonst Deklariert man schlicht<br />

e<strong>in</strong>e Funktion <strong>die</strong> e<strong>in</strong>en Zeiger auf <strong>in</strong>t zurückliefert:<br />

<strong>in</strong>t *f (<strong>in</strong>t x); /* Funktion, <strong>die</strong> e<strong>in</strong>en Zeiger auf <strong>in</strong>t zurückliefert */<br />

<strong>in</strong>t (*f) (<strong>in</strong>t x); /* E<strong>in</strong> Zeiger auf e<strong>in</strong>e Funktion, <strong>die</strong> <strong>in</strong>t zurückliefert<br />

*/<br />

<strong>in</strong>t *(*f) (<strong>in</strong>t x); /* E<strong>in</strong> Zeiger auf e<strong>in</strong>e Funktion, <strong>die</strong> e<strong>in</strong>en Zeiger<br />

auf <strong>in</strong>t zurückliefert */<br />

<strong>E<strong>in</strong>e</strong> Funktion wird wie folgt über e<strong>in</strong>en Zeiger aufgerufen:<br />

r = (*Fptr)(x, y); /*Mit expliziter Po<strong>in</strong>terdereferenzierung */<br />

r = Fptr(x, y); /*Vere<strong>in</strong>fachte, uebliche Variante (Syntaktisch<br />

<strong>in</strong>konsequent)*/<br />

Nachfolgend e<strong>in</strong> Beispiel für den E<strong>in</strong>satz e<strong>in</strong>es Funktionszeigers:<br />

<strong>in</strong>t (*FPtr)(<strong>in</strong>t a);<br />

<strong>in</strong>t f1(<strong>in</strong>t y)<br />

{<br />

return y - 2;<br />

}<br />

<strong>in</strong>t f2(<strong>in</strong>t y)<br />

{<br />

return y + 2;<br />

}<br />

FPtr = f1; /* oder FPtr = &f1; Adresse der Funktion abspeichern */<br />

a = FPtr(17); /* Aufruf der Funktion, auf <strong>die</strong> der Po<strong>in</strong>ter zeigt */<br />

FPtr = f2; /* Adresse der Funktion abspeichern */<br />

a = FPtr(a); /* Aufruf der Funktion, auf <strong>die</strong> der Po<strong>in</strong>ter zeigt */<br />

Achtung, <strong>die</strong> Funktion muss zum Zeigertyp passen, e<strong>in</strong>em Funktionszeiger kann nur <strong>die</strong> Adresse<br />

e<strong>in</strong>er Funktion übergeben werden, <strong>die</strong> e<strong>in</strong>e passende Argumentenliste <strong>und</strong> e<strong>in</strong>en passenden Rückgabetyp<br />

besitzt.<br />

<strong>in</strong>t (*FPtr)(<strong>in</strong>t a);<br />

<strong>in</strong>t f2(<strong>in</strong>t y, <strong>in</strong>t z)<br />

{<br />

return y + 2;<br />

}<br />

FPtr = f2; /* Error, Funktion passt nicht zu Po<strong>in</strong>ter (f2 hat 2 Argumente) */<br />

Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 63/147

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!