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
?
N1570 6.3.2.1左辺値、配列、および関数指定子は次のように述べています。
4関数指定子は、関数型を持つ式です。sizeof演算子、_Alignof演算子、65)または単項&演算子のオペランドである場合を除いて、タイプ ''関数戻りタイプ ''の関数指定子は、タイプ ''関数戻りタイプへのポインターを持つ式に変換されます。 ''。
ここではa
と*func
されている機能指定子彼らは関数型を持っているので。a
in&a
は単項演算&
子のオペランドであり、関数へのポインタは演算子によって取得されるため、ポインタに変換されません&
。一方、a
infunc = a;
は、このルールに従って関数へのポインタに変換されます。従ってa
そして&a
このコードに等価です。
またfunc
、func(x);
このルールに従って、inはポインタに変換されます。
(*func)(x);
は:
func
このルールに従ってポインタに変換されます*
れます*func
*func
このルールに従ってポインタに変換されますしたがって、(*func)(x);
と同等func(x);
です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加