プロが教えるわが家の防犯対策術!

#include <stdio.h>

void PrintNum(int num)
{
printf("num = %d\n", num);
}

int main(void)
{
void (* pfunc)(int);

pfunc = PrintNum;

(* pfunc)(1); // 旧仕様の書式
pfunc(2); // 新仕様の書式

return 0;
}


新仕様の書式と書いている行
なぜ出力が2になるのですか?

PrintNumとポインタ*pfuncが同じということはわかります
じゃあその逆のpfuncは*PrintNumと同じではないのですか?そうなら関数ではないのではないでしょうか?

このコードはあるサイトのコピペです。

A 回答 (2件)

この辺はCは歪んでるので


悩んでも仕方がない。
Cに関数へのポインタはあるけど、関数オブジェクトはありません。
式中に
PrintNum とかいても、&PrintNum
とかいても、両方とも関数ポインタだし
pfunc も*pfuncも関数ポインタ。

pfunc(1)

(*pfunc)(1)
も全く同じで、関数ポインタの指す関数が実行されるだけ。

覚えておくべきはこれだけ。

関数のエントリポイント(関数ポインタ)が関数そのもの
で区別が無いというのがcの考え方ということでよいと思う。
実際この認識で何の支障も無い。
    • good
    • 0

現在の仕様では「関数へのポインタを使って呼び出す」のが本来の形ではある, んだけど...



「ポインタ*pfunc」って, どういう意味で使ってる? そして, 「PrintNumとポインタ*pfuncが同じ」からどうして「その逆のpfuncは*PrintNumと同じ」と結論づけたのか, どこがどう「逆」であってどうしてそのような結論を導いたのかという「理屈の流れ」を教えてもらえないだろうか.
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング