C言語関係掲示板

過去ログ

No.553.関数ポインタの明示的な書き方をする時の、逆参照演算子

[戻る] [ホームページ]
No.4920

関数ポインタの明示的な書き方をする時の、逆参照演算子について
投稿者---初心(2003/02/03 01:21:29)


はじめまして、C言語を勉強中の素人です。
早速で申し訳なのですが、題名通り、関数ポインタについての質問です。

int plus(int x,int y)
{
  return x+y;
}
という関数があったとして、この関数ポインタ変数を作成します
  int (*func)(int,int)=plus;
この関数ポインタを使用する場合、
  func(1,2);
という記述だと思います。
この時点では、関数名はポインタを持ち、ポインタ変数から関数を呼べるので、
関数を呼び出す際の()の働きは、配列の添え字演算子[]
みたいなものだと思っていました。

しかし、関数ポインタであることを明示化する記述の場合
  (*func)(1,2);
と書くらしいのです。
変数funcがポインタである以上、*は逆参照演算子となるはずですよね?
なぜこのような記述が可能なのでしょうか?
なんとなくインライン関数みたいな働きをしてくれそうな気がしますが・・・
違いますね、絶対。
ちなみに、関数ポインタを使用して関数を呼び出すには
(func)(1,2);
でも可能でした。
コンパイラはVC++6.0です。
どうかよろしくお願いします。



No.4922

Re:関数ポインタの明示的な書き方をする時の、逆参照演算子について
投稿者---c (2003/02/03 08:54:50)



>  int (*func)(int,int)=plus;
>この関数ポインタを使用する場合、
>  func(1,2);

funcは暗黙のポインターだから

>  (*func)(1,2);
>変数funcがポインタである以上、*は逆参照演算子となるはずですよね?
>なぜこのような記述が可能なのでしょうか?

ただ暗黙変換される前ににコンパイル君に教えただけ

>なんとなくインライン関数みたいな働きをしてくれそうな気がしまが

たぶん優秀なコンパイラはしてくれているかも

>ちなみに、関数ポインタを使用して関数を呼び出すには
>(func)(1,2);
>でも可能でした。
これはたんに暗黙のポインターに括弧を付けただけだから
(((((func)))))(1,2);
でも意味は変わらない


No.4927

Re:関数ポインタの明示的な書き方をする時の、逆参照演算子について
投稿者---c(2003/02/03 09:59:32)


嘘でした.
以下「ポインター完全制覇」より抜粋。
関数は式の中では関数へのポインターに自動的に変換されるみたいです。
もちろん例外もあります。&、sizeofのとき。
関数へのポインターに対して間接参照演算子[*]を適用すると
いったん関数に戻されてそして、式の中なので関数へのポインターに変換
されるみたいです。
(*****func)(1,2);てなことが出来る。


No.4951

御礼申し上げます
投稿者---初心(2003/02/03 18:05:26)


Cさん、ありがとうございました。
これでC言語に対する疑問は今の所全て解決できました。

>関数は式の中では関数へのポインターに自動的に変換されるみたいです。
ということは直接関数名を使用するより関数ポインタを使用した方が
コンパイル時間が短くなりそう・・・

>いったん関数に戻されてそして、式の中なので関数へのポインターに変換
>されるみたいです。
こっちの場合は少し長くなりそうな気が・・・

まぁ両方とも人間が感じ取れる時間じゃないでしょうが(笑)
本当にありがとうございました。
もし本屋でポインター完全制覇なる本を見つけたら読んでみようと思います。
それでは