C言語の関数のアドレスを参照する方法
目次
C言語の関数のアドレスを扱う
C言語を使ってると関数はなじみのある機能かと思います。
実は関数にもアドレスというものがあります。
アドレスとはメモリ上の位置ですね。
ということは関数のアドレスもポインタに保存できるのでしょうか?
というところなんですが、できます。
この記事では関数のアドレスを参照する方法を具体的に解説していきます。
関連記事
アドレスとはそもそも何か?
アドレスとはメモリ上の位置のことを言います。
アドレスは英語にすると「address」になりこれは辞書では
住所
所番地
という意味を持っています。
つまり変数や関数などのメモリ上の住所がアドレスということですね。
「こんにちは~」と言って菓子折りを持って行くとそのアドレスには関数が住んでいるという感覚です。
アドレスがわかれば関数も呼び出すことができます。
この呼び出しには関数ポインタという特殊なポインタを使います。
関数を間接的に呼び出すことが出来るので非常に便利です。
関数のアドレスを出力する
C言語で関数のアドレスを画面に出力するにはprintf()を使います。
↓のように%p
フォーマット指定子で関数のアドレスを出力できます。
#include <stdio.h> void func(void) { } int main(void) { printf("%p\n", func); // 00007ff7e23b1591 return 0; }
アドレスの値は環境によって変わります。
ポインタとは?
関数ポインタについて解説する前にそもそものポインタについて簡単に解説します。
詳細な解説は↓の記事をご覧ください。
ポインタとは簡単に言うとアドレスを保存する変数のことを言います。
ポインタはアドレスを保存する変数
ポインタ変数にたとえば関数のアドレスを保存します。
そうするとそのポインタは関数のアドレスを持っていることになります。
関数は関数のアドレスがわかれば呼び出せます。
ですのでそのポインタにカッコを付けて関数コールをすると間接的にそのアドレスの関数を呼び出すことができます。
関数のアドレスをポインタに保存する
関数のアドレスをポインタに保存するには関数ポインタを使います。
関数ポインタについては↓の記事をご覧ください。
簡単に言うと関数ポインタの変数の定義は↓のように行います。
返り値の型 (*ポインタ変数名)(引数の型) = 関数のアドレス;
具体的にコードで見てみましょう。
#include <stdio.h> void func(void) { puts("Hello"); } int main(void) { void (*funcptr)(void) = func; funcptr(); // Hello return 0; }
↑の場合、funcptr
というのが関数ポインタです。
この関数ポインタfuncptr
にfunc()
のアドレスを代入しています。
関数ポインタはカッコを付けて関数のように呼び出すと関数のアドレスから関数をコールすることができます。
funcptr()
を呼び出すとfunc()
が呼ばれて画面には「Hello」と出力されます。
おわりに
今回はC言語の関数のアドレスについて解説しました。
アドレスはポインタに保存できるので覚えておいてください。
(^ _ ^) | 関数のアドレスをポインタにシュート |
(・ v ・) | ポインタにカッコを付けて関数呼び出し |