私は関数ポインタが関数のアドレスを格納していることを知っています。ここで、関数ポインタが格納するアドレスは
int fun(int x){
//return something
}
int (pfun*)(int)=&fun;
int main(){
std::cout << &fun << "\n"; // this print out 1
std::cout << fun << "\n" ; // this print out 1
std::cout << &pfun << "\n"; // this print out 0x0022ff40
std::cout << pfun << "\n" ; // this print out 1
}
は、だから私の質問は以下のとおりです。
1)あれば楽しい()でも楽しみをポイントしていpfunすることができますどのようにアドレスを持っていません()。
2)たとえば、実行時にポインタ関数を使用するときの動的バインディングでは、コンパイラはpfunの値を0Xのような実際のポインタに変更するのですか?実行時に、コンパイル後に名前が存在しないのでどの関数を呼び出すのかを知るでしょうか?
正しく覚えていれば、 'void *'への関数ポインタのキャストは許されません。標準で明示的にそう言われていますが...具体的にはメンバ関数のポインタだったので、チェックする必要があります。 –
@Als:答えに技術的に正しい*コメントはありません。事実、IIRCはほとんどのアーキテクチャで動作しますが、標準では関数やデータのポインタのサイズが異なるため元の結果を生み出す...そして、私が言及したように、それが価値を生み出すプラットフォームでさえも、それは役に立たない。 –
'void *'への関数ポインタを明示的に記述することは無効であり、メンバ関数ポインタにのみ適用できますか?またはフリースタンディング関数ポインタ? –