雑記帳

関数ポインタ

※ C言語を深く知らない人によるメモなので、専門の人からするとガバガバな認識の可能性あり。
関数ポインタ
関数ポインタ型は次のように表される。
type(*)(type,type,...)
例えば、関数ポインタ型の変数fooの宣言は「type(*foo)(type,type,...)」で行い、何らかの変数hogeの関数ポインタ型への型変換は「(type(*)(type,type,...))hoge」で行うことが可能?
関数名(正確には関数型?)が関数ポインタを返すため、関数名から関数ポインタ受け取れ、愚直にアドレス演算子に関数名を渡しても関数ポインタを取得できる。
→ 関数(マクロ関数は除く)の呼び出しは「関数ポインタの後に引数を指定するカッコ(Function Call Operator: 関数呼び出し演算子?)を置く」ことで行われている的な?
(関数においても、「ラベル(関数名)」がベースになっているのではなく、「データ型と位置(アドレス)」がベースになっているという見方もできたり?)
わかりやすい例として、「(&printf)("test")」について、「&printf」からはその関数のアドレスを持った「int(__cdecl *)(const char *const, ...)」型の関数ポインタ、すなわち「printf」から得られる関数ポインタを得ることになり、期待通りしっかりと「printf("test")」と同じ動作をする。
どうでもいいことかもしれないけど、宣言や初期化について、
TCHAR test1[];
TCHAR test1[]=_T("aaa");
void(test2)(void);
void(test2)(void){return;}
とを見比べてみても、割と一貫していて綺麗。