せずに関数ポインタを初期化私は関数ポインタで遊んで、かつ直感的に以下のコードを見てみましょうC.「&」演算子
内のポインタの私の理解に合わないものに走りました。 :私はCの他のポインタのような関数ポインタを扱う場合
include <stdio.h>
void fun(int a) {
printf("fun, %d!\n", a);
}
void bun(int b) {
printf("bun, %d!\n", b);
}
int main(){
void (*fooptr)(int) = &bun;
void (*blooptr) (int) = fun;
fooptr(200);
blooptr(100);
return 0;
}
、私は互換性のない型に対してコンパイラの警告をトリガするvoid (*blooptr) (int) = fun;
を期待するべきです。私のコードは(サイレントに)コンパイルされ、期待どおりに動作します。
Cは、コンパイラの警告さえなくても、普通のポインタを実行するのと同じように、&
演算子を使用せずに関数ポインタを初期化できますか?これは私が間違って適切な振る舞いをしているケースの1つですが、私は技術的にはの未定義の動作です領土ですか?もしも誰かがを説明できるのであれば、これはうまくいくでしょう。なぜなら、関数ポインタの本質にいくつかの洞察力(文献への言及もあります)があるからです。
この特定の質問を探してみましたが、関連するものは見つかりませんでした。ちょっと基本的なようだから、それがダブだと謝ります。
これは、配列を渡すようなものです - Cは、矛盾した、混乱しているアドレスを保持するだけで、時にはアドレス演算子を必要とします:( –