関数のアドレスとポインタ
C言語編 第43章 関数ポインタ
http://www.geocities.jp/ky_webid/c/043.html
pという名前の関数ポインタに、myabs関数のアドレスを代入するには、
p = myabs;
とするだけです。次に、関数ポインタから関数を呼び出す方法ですが、これには2通りの方法があります。
ans = (*p)(-100); /* myabs(-100); という呼び出しと同じ結果 */
また、次のように書くこともできます。
ans = p(-100); /* myabs(-100); という呼び出しと同じ結果 */
後者の方法では、関数ポインタから参照によって関数を呼んでいるのか、それともp関数という関数を呼んで いるのかが分かりにくくなります。違いをはっきりさせるために、前者の方法を使うことが多いようです。
なんで*pとpのどっちでもいいのか疑問に思ったのでちょっと実験
#include<stdio.h> foo(){ puts("foo"); } main(){ printf("%d\n",foo); printf("%d\n",*foo); printf("%d\n",**foo); printf("%d\n",&foo); foo(); (*foo)(); (**foo)(); (&foo)(); }
実行結果
$ ./a.out 8014 8014 8014 8014 foo foo foo foo
なんと、すべて同じ値だった。
関数名の変数(?)には自分自身のアドレスが入っていたのか。