関数のアドレスとポインタ

C言語編 第43章 関数ポインタ
pという名前の関数ポインタに、myabs関数のアドレスを代入するには、
p = myabs;
とするだけです。次に、関数ポインタから関数を呼び出す方法ですが、これには2通りの方法があります。
ans = (*p)(-100); /* myabs(-100); という呼び出しと同じ結果 */
また、次のように書くこともできます。
ans = p(-100); /* myabs(-100); という呼び出しと同じ結果 */
後者の方法では、関数ポインタから参照によって関数を呼んでいるのか、それともp関数という関数を呼んで いるのかが分かりにくくなります。違いをはっきりさせるために、前者の方法を使うことが多いようです。

http://www.geocities.jp/ky_webid/c/043.html

なんで*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

なんと、すべて同じ値だった。
関数名の変数(?)には自分自身のアドレスが入っていたのか。