学習しているのですが、質問です。以下のコードで、
#include<stdio.h>
typedef void (* FUNC_POINTER)(char *); //関数ポインタのtypedef
void func1(char *s){
printf("%s\n",s);
}
void func2(char *s){
int i;
for(i=0;i<2;i++){
printf("%s\n",s);
}
}
void func(char *s,FUNC_POINTER p){
p(s);
}
int main(){
FUNC_POINTER p;
p = func1;
func("ありがと",p);
p = func2;
func("Thanks",p);
return 0;
}
p(s);やprintf("%s\n",s);のp、sはポインタであり、アドレスを示していると
思い、実行結果はアドレスがそれぞれ表示されると思ったのですが、
実際は、
ありがと
Thanks
Thanks
と、表示されました。
なので、ここでは実体(pはfunc1、2,sは"ありがと","Thanks")として
使われているように思えるのですが、なぜなのでしょうか?
(printf("%s\n",s);をprintf("%s\n",*s);としてみると、例外が発生しました)
pのほうは、アドレスが"func1"であるため、アドレスがそのまま関数名なので、p(s)はfunc1(1)、func(2)である、ということなのでしょうか?
自分が勘違いしているか、
なにか別の使い方があるのでしょうか?