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