関数ポインタとは

かんすうぽいんた

関数の番地を値として持つポインタ。int (*fp)(int, int) = add; のように、引数と戻り値の型を含めて宣言し、fp(1, 2) または (*fp)(1, 2) で指す先の関数を呼び出す。関数ポインタの配列を使えば、番号に応じて処理を切り替える表を作れる。ソートの比較関数を渡す qsort のようなコールバック、割り込みのベクタの表、状態機械の各状態の処理などに使われる。機械語では、番地をレジスタに入れて飛ぶ間接呼び出しになる。

「関数ポインタ」は、2分野の3問の練習問題に出てきます(命令セット・アセンブリ, C言語の基礎など)。

この用語の分野: C言語の基礎

関数ポインタの練習問題に挑戦

C言語の関数ポインタを使った呼び出し「(*fp)(x)」は、RISC-Vでは一般にどの命令で行われるか。

  1. A関数の番地をレジスタに入れて、jalrでそのレジスタの番地へ飛ぶ
  2. Bjalに関数の番地を即値で書いて飛ぶ
  3. Cbeqで関数の番地と比べて、等しければ飛ぶ
答えと解説を見る

正解:A. 関数の番地をレジスタに入れて、jalrでそのレジスタの番地へ飛ぶ

関数ポインタの指す先は実行時まで分からないので、命令の中に行き先を書くjalは使えません。そこで、ポインタの値をレジスタに読み込み、「jalr ra, 0(t0)」のようにレジスタの番地へ飛び、戻り先はraに残します。C++の仮想関数や共有ライブラリの関数の呼び出しも、同じような間接呼び出しです。行き先が変わるので、CPUは間接分岐の予測器で行き先を予想します。

解説の中の「関数ポインタ」

「関数ポインタ」が出てくる問題(3問)

  1. C言語の関数ポインタを使った呼び出し「(*fp)(x)」は、RISC-Vでは一般にどの命令で行われるか。
  2. 関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
  3. RISC-Vの疑似命令「ret」は、実際にはどの命令として実行されるか。

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

ポインタ リターンアドレス 共有ライブラリ 配列 疑似命令 アライメントとパディング 共用体 構造体 整数拡張 ダングリングポインタ

用語集の一覧へ