funcがCの&funcと同じように見えるのはなぜですか?

アルダンクレオ

GNU Cのマニュアルによると、関数は次のような関数ポインタを使用して呼び出すことができます。

func (j);  /* (*func) (j); would be equivalent. */

したがって、ここでの私の推論は次のとおりです。funcそれ自体がfunc(int)関数へのポインタです。を呼び出すとfunc(j)たとえば整数へのポインタがある場合と同じように、ポインタの値に暗黙的にアクセスしますfunc(メモリの場所に移動しますfunc)。その中に格納されている値にアクセスします。を使用したメモリの位置*これは、を使用して同じ関数を呼び出すことができるという事実と一致します(*func)(j)

実際、cprogramming.comでは、関数のポインターへのポインターを持つことができると言われていますしたがって、他の種類のポインタと同じように機能すると思います。

しかし、そうだとすれば、なぜこのコードが機能するのでしょうか。

#include <stdlib.h>
#include <stdio.h>

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

int main() {
    int x = 5;
    void (*func)(int); // Declare a pointer to a function
    func = &a; // Pointer to a pointer to a function
    (*func)(x); // Calls the function (why?)
    func = a; // Pointer to a function
    (*func)(x); // Calls the function (makes sense)
}

さらに、あなたが呼び出す場合:

printf("%s\n", (&a == a) ? "True" : "False");

印刷しTrueます!

私は確信している&fooのと同じではありません&&foo、例えば、その理由、それはケースのように見えるんfuncと同じですか&func

MikeCAT

N1570 6.3.2.1左辺値、配列、および関数指定子は次のように述べています。

4関数指定子は、関数型を持つ式です。sizeof演算子、_Alignof演算子、65)または単項&演算子のオペランドである場合を除いて、タイプ ''関数戻りタイプ ''の関数指定子は、タイプ ''関数戻りタイプへのポインターを持つ式に変換されます。 ''。

ここではa*funcされている機能指定子彼らは関数型を持っているので。ain&aは単項演算&子のオペランドであり、関数へのポインタは演算子によって取得されるため、ポインタに変換されません&一方、ainfunc = a;は、このルールに従って関数へのポインタに変換されます。従ってaそして&aこのコードに等価です。

またfuncfunc(x);このルールに従って、inはポインタに変換されます。

(*func)(x); は:

  1. func このルールに従ってポインタに変換されます
  2. ポインタはで逆参照さ*れます*func
  3. *func このルールに従ってポインタに変換されます

したがって、(*func)(x);と同等func(x);です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JavascriptのMath.pow()がCの同じ値と比較して、丸められた値を返すように見えるのはなぜですか?

分類Dev

彼らは同じような仕事をしているように見えますが、なぜ拡散と破壊が異なるのですか?

分類Dev

ラムダ演算子が同じように見えるのはなぜですか?

分類Dev

Canvasの同じ場所に描画すると、Paint.ANTI_ALIAS_FLAGが機能しないように見えるのはなぜですか?

分類Dev

この条件文が機能せず、同じことをしているように見えるif文が機能するのはなぜですか?

分類Dev

C ++ rand()が同じ桁数の数値のみを生成するように見えるのはなぜですか?

分類Dev

ハードリンクが元のリンクと同じスペースを占めるように見えるのはなぜですか?

分類Dev

これらのopengl長方形が同じように見えないのはなぜですか?

分類Dev

一見同じように見える2つの変数が2つの異なる結果を生成するのはなぜですか?

分類Dev

同じ構造が与えられているのに、インポートと同じように動作する必要がないのはなぜですか

分類Dev

同じように見えるルビ文字列は等しくないのはなぜですか?

分類Dev

これら2つの一見同じように見えるCypherクエリの速度が大きく異なるのはなぜですか?

分類Dev

これらの文字列が同じように見え、コードによって異なる方法で処理されるのはなぜですか?

分類Dev

彼らが同じことをしているように見えるのに、なぜJestで酵素を使うのですか?

分類Dev

MersenneTwisterが同じシードに対して異なるシーケンスを生成するように見えるのはなぜですか?

分類Dev

(コンピューター上の)すべてのアカウントのパスワードが同じように見えるのはなぜですか?

分類Dev

GHCタイプチェッカーが、ほとんど同じように見える2つの関数の1つと同じではないのはなぜですか?

分類Dev

VSTS:パイプラインが同じユーザーによってトリガーされているように見えるのはなぜですか?

分類Dev

func()はfuncと同じですか?

分類Dev

一見同じように見える3項演算子構成体が生成しないのに、 'if-else'ステートメントを使用するとTypeScriptコンパイラエラーが生成されるのはなぜですか?

分類Dev

stdinとstdoutが一見互換性があるように見えるのはなぜですか?

分類Dev

式のLHSの `rlang :: sym`と` rlang :: quo_name`が同じように動作するのはなぜですか?

分類Dev

decltype(&T :: func)が機能しないのに、decltype(declval <T>()。func())が機能するのはなぜですか?

分類Dev

この状況でraxとrdiが同じように機能するのはなぜですか?

分類Dev

BooleanFilter が利用できないように見えるのはなぜですか?

分類Dev

出力が異なるように見えるのはなぜですか?

分類Dev

出力が異なるように見えるのはなぜですか?

分類Dev

この匿名のfuncが構造体の同じインスタンスを返すのはなぜですか?

分類Dev

load()がHibernateのget()と同じように機能するのはなぜですか?

Related 関連記事

  1. 1

    JavascriptのMath.pow()がCの同じ値と比較して、丸められた値を返すように見えるのはなぜですか?

  2. 2

    彼らは同じような仕事をしているように見えますが、なぜ拡散と破壊が異なるのですか?

  3. 3

    ラムダ演算子が同じように見えるのはなぜですか?

  4. 4

    Canvasの同じ場所に描画すると、Paint.ANTI_ALIAS_FLAGが機能しないように見えるのはなぜですか?

  5. 5

    この条件文が機能せず、同じことをしているように見えるif文が機能するのはなぜですか?

  6. 6

    C ++ rand()が同じ桁数の数値のみを生成するように見えるのはなぜですか?

  7. 7

    ハードリンクが元のリンクと同じスペースを占めるように見えるのはなぜですか?

  8. 8

    これらのopengl長方形が同じように見えないのはなぜですか?

  9. 9

    一見同じように見える2つの変数が2つの異なる結果を生成するのはなぜですか?

  10. 10

    同じ構造が与えられているのに、インポートと同じように動作する必要がないのはなぜですか

  11. 11

    同じように見えるルビ文字列は等しくないのはなぜですか?

  12. 12

    これら2つの一見同じように見えるCypherクエリの速度が大きく異なるのはなぜですか?

  13. 13

    これらの文字列が同じように見え、コードによって異なる方法で処理されるのはなぜですか?

  14. 14

    彼らが同じことをしているように見えるのに、なぜJestで酵素を使うのですか?

  15. 15

    MersenneTwisterが同じシードに対して異なるシーケンスを生成するように見えるのはなぜですか?

  16. 16

    (コンピューター上の)すべてのアカウントのパスワードが同じように見えるのはなぜですか?

  17. 17

    GHCタイプチェッカーが、ほとんど同じように見える2つの関数の1つと同じではないのはなぜですか?

  18. 18

    VSTS:パイプラインが同じユーザーによってトリガーされているように見えるのはなぜですか?

  19. 19

    func()はfuncと同じですか?

  20. 20

    一見同じように見える3項演算子構成体が生成しないのに、 'if-else'ステートメントを使用するとTypeScriptコンパイラエラーが生成されるのはなぜですか?

  21. 21

    stdinとstdoutが一見互換性があるように見えるのはなぜですか?

  22. 22

    式のLHSの `rlang :: sym`と` rlang :: quo_name`が同じように動作するのはなぜですか?

  23. 23

    decltype(&T :: func)が機能しないのに、decltype(declval <T>()。func())が機能するのはなぜですか?

  24. 24

    この状況でraxとrdiが同じように機能するのはなぜですか?

  25. 25

    BooleanFilter が利用できないように見えるのはなぜですか?

  26. 26

    出力が異なるように見えるのはなぜですか?

  27. 27

    出力が異なるように見えるのはなぜですか?

  28. 28

    この匿名のfuncが構造体の同じインスタンスを返すのはなぜですか?

  29. 29

    load()がHibernateのget()と同じように機能するのはなぜですか?

ホットタグ

アーカイブ