Flo J. schrieb:
>
1 | struct netif {
|
2 | > /** pointer to next in linked list */
|
3 | > struct netif *next;
|
4 | > ...
|
5 | > /** This function is called by the network device driver
|
6 | > * to pass a packet up the TCP/IP stack. */
|
7 | > err_t (* input)(struct pbuf *p, struct netif *inp);
|
8 | > ...
|
>
> Dass in einem struct Namens netif wiederum ein Pointer desselben Typs
> netif auftaucht ist mir neu,
Das ist eine verkettete Liste. Jede Struktur zeigt einfach auf die
nächste Struktur in der Liste. Möglich ist das, da Zeiger immer
diegleiche Größe haben (auf 32-Bit-Systemen meist 4 Bytes), d.h. die
Sache läuft nicht 'rekursiv', wie man vermuten könnte. Ein Zeiger auf
ein Byte braucht genauso viel Platz, wie ein Zeiger auf eine riesige
Datenstruktur.
> aber erst recht verstehe ich nicht was in
> der Zeile mit err_t passiert. Funktionsaufruf mit Rückgabewert in einer
> struct Definition?
Jein, wichtig ist das linke Klammerpaar. Damit wird eine Zeigervariable
namens 'input' vereinbart. Der Rest drumherum bildet den Zeigertyp, der
ist hier: Funktion mit zwei Argumenten und Rückgabewert err_t.
Beispiel:
1 | int eine_funktion(int a, char b) {
|
2 | /* ... */
|
3 | }
|
4 |
|
5 | int (*zeiger_auf_eine_funktion)(int a, char b);
|
6 | zeiger_auf_eine_funktion = &eine_funktion;
|
Wobei der Adressoperator ('&') da auch wegfallen darf. Danach bewirken
folgende Anweisungen dasselbe:
1 | int ergebnis;
|
2 | ergebnis = eine_funktion(1, 2);
|
3 | ergebnis = (*zeiger_auf_eine_funktion)(1, 2);
|
Analog darf auch hier der Verweisoperator ('*') entfallen, es reicht,
einfach zu schreiben:
1 | ergebnis = zeiger_auf_eine_funktion(1, 2);
|
> edit: Und mich stört das Leerzeichen zwischen * und input. Ein Pointer
> sieht für mich so aus: *input
Leerzeichen, Zeilenumbrüche etc. fallen in C unter 'Leerraum'. Hier ists
egal, ob und wo ein Leerzeichen steht.