Was ist Funktionszeiger?

Zeiger, dessen Wert die Adresse einer Funktion ist. Deklariert wird er einschließlich der Typen von Argumenten und Rückgabewert, etwa int (*fp)(int, int) = add;, und fp(1, 2) oder (*fp)(1, 2) ruft die Funktion auf, auf die er zeigt. Mit einem Array von Funktionszeigern lässt sich eine Tabelle bauen, die je nach Nummer zwischen Verarbeitungen umschaltet. Verwendet wird er für Callbacks wie die Vergleichsfunktion für qsort, für Interrupt-Vektortabellen und für die Verarbeitung der einzelnen Zustände eines Zustandsautomaten. Im Maschinencode wird daraus ein indirekter Aufruf, der die Adresse in ein Register lädt und dorthin springt.

Japanische Bezeichnung: 関数ポインタ

„Funktionszeiger“ kommt in 3 Übungsfragen aus 2 Themen vor, z. B. Befehlssatz und Assembler, Grundlagen der Programmiersprache C.

Fachgebiet: Grundlagen der Programmiersprache C

Jetzt üben: Fragen zu Funktionszeiger

Mit welchem Befehl erfolgt in RISC-V im Allgemeinen ein Aufruf über einen C-Funktionszeiger „(*fp)(x)“?

  1. ADie Funktionsadresse wird in ein Register geladen und mit jalr zur Adresse in diesem Register gesprungen
  2. BMit jal wird die Funktionsadresse als Immediate angegeben und gesprungen
  3. CMit beq wird die Funktionsadresse verglichen und bei Gleichheit gesprungen
Antwort und Erläuterung anzeigen

Antwort: A. Die Funktionsadresse wird in ein Register geladen und mit jalr zur Adresse in diesem Register gesprungen

Das Ziel eines Funktionszeigers steht erst zur Laufzeit fest, daher ist jal, das das Ziel im Befehl angibt, nicht verwendbar. Stattdessen wird der Zeigerwert in ein Register geladen und mit „jalr ra, 0(t0)“ zur Adresse im Register gesprungen, die Rücksprungadresse bleibt in ra. Auch Aufrufe virtueller C++-Funktionen oder von Funktionen in Shared Libraries sind ähnliche indirekte Aufrufe. Da sich das Ziel ändert, sagt die CPU es mit einem Prädiktor für indirekte Sprünge voraus.

„Funktionszeiger“ in den Erläuterungen

Fragen mit „Funktionszeiger“ (3)

  1. Mit welchem Befehl erfolgt in RISC-V im Allgemeinen ein Aufruf über einen C-Funktionszeiger „(*fp)(x)“?
  2. Welche Ausgabe erzeugt das obige Programm mit einem Array von Funktionszeigern bei der Ausführung?
  3. Als welcher Befehl wird der RISC-V-Pseudobefehl „ret“ tatsächlich ausgeführt?

Verwandte Begriffe

Rücksprungadresse Array Zeiger (Pointer) Pseudobefehl Ausrichtung und Auffüllung (Alignment und Padding) Bitfeld Dangling Pointer (hängender Zeiger) Dynamische Speicherreservierung Integer-Promotion Makro

Zur Glossarübersicht