関数ポインタとポインタ関数:超詳細-関数ポインタパラメータ


関数ポインタ:
関数ポインタの本質はポインタであり、ポインタのアドレスは関数を指すので、関数を指すポインタである.
int (*test)()
オブジェクトではなく関数を指します.他のポインタと同様に、関数ポインタは特定のタイプを指します.関数のタイプは、その戻りタイプとパラメータタイプによって決まります.関数名に関係なく
void show(int a);//関数を指すポインタを宣言するには、関数名をポインタで置き換えるだけです
void(*print)(int a);//printはintパラメータでvoidタイプを返す関数を指します.
1、関数ポインタの使用
ポインタと同じタイプの関数がある場合は、直接値を割り当てます.
    print = show;//print 1はprintという関数print=&showを指す.//等価の付与文:アドレスを取るのは選択したprint=0です.//ゼロにすることもできます.関数を指さないことを示します.
    int a = 0;     print(a);//この場合はショーの代わりにprintを直接使用できます
2,リロード関数のポインタ
リロード関数を指す場合は、どの関数を指すべきかをクリアする必要があります.
void test(int a); void test(char a); void test(double a);//testのリロード関数
//void(*test1)(unsigned a) = test;エラーは、testのリロード関数にunsignedタイプのvoid(*test 1)(char a)=testがないためです.//正しく、2番目のtestリロード関数を指す
3,関数ポインタパラメータ
すなわち,関数をパラメータとして伝達する.
  • void test(int a,int b,int print(int a));//3番目の関数タイプは、自動的に関数を指すポインタ
  • に変換されます.
  • void test(int a,int b,int (*print)(int a));//表示されるパラメータを関数を指すポインタ
  • として定義する
    次の操作を行います.
  • test(a, b, print1);//直接関数print 1を実パラメータとして使用すると、ポインタ
  • に自動的に変換されます.
    またdecltypeを使用して関数ポインタコードの使用を簡略化することもできます
    #include
    using namespace std;
    
    int compare(int a,int b)
    {
    	return a > b ? a : b;
    }
    
    //       
    void test(int a, int b, int compare(int, int))
    {
    	cout << a + (compare)(a, b) << endl;
    }
    void test1(int a, int b,int pf(int,int))        //    ,             
    {
    	cout << a + (*pf)(a,b) << endl;
    }
    void test2(int a, int b, int(*pf)(int, int))       //                
    {
    	cout << a + (*pf)(a, b) << endl;
    }
    
    
    int m1(int, int);
    typedef decltype(compare) compare1;      //     :    
    int(*m2)(int, int);
    typedef decltype(compare) *compare2;     //     :       
    
    void test11(int a, int b, compare1 x)     //     :      
    {
    	cout << a + (*x)(a, b) << endl;
    }
    void test21(int a, int b, compare2 x)     //     :       
    {
    	cout << a + (*x)(a, b) << endl;
    }
    
    
    int main()
    {
    	int a = 10, b = 20;
    	test(a, b, compare);
    	test1(a, b, compare);
    	test2(a, b, compare);
    	test11(a, b, compare);
    	test21(a, b, compare);
    	system("pause");
    	return 0;
    }

    4、関数へのポインタを返します
    配列と同様に、1つの関数を返すことはできませんが、関数タイプを指すポインタを返すことができます.しかし、戻りタイプをポインタ形式に書かなければなりません.コンパイラは関数戻りタイプを対応するポインタタイプとして自動的に処理しません.
    int (*ff(int)) (int *,int);表示:ff(int)は、int型のパラメータを持つ関数で、int(*)(int*,int)を返します.これは関数を指すポインタで、int型を返し、Int*とint型のパラメータを2つ持っています.
    (次の内容はネットで長い間見ていたので比較的良い感じの回答)
    最初の硬剛は、直接定義されているので、cの宣言方法に詳しい必要があります.たとえば、パラメータがない関数を宣言します.戻り値は関数ポインタで、パラメータがintで、戻り値がintの関数を指します.少し回ったかもしれませんが、何度も読めばいいので、フォーマットは以下の通りです.
    方法1:
    int (*fun())(int); 中から外へ理解する.最初のfun()説明はfunという関数で、パラメータはありません.次に、最外層はint(*)(int)がfun関数の戻り値を表す.は、戻り値int、パラメータintの関数を指すポインタです.
    方法2:
    typedef int (*funPointer)(int);//関数を指すポインタfunPointer fun()のタイプfunPointerを定義します.//戻り値が関数へのポインタである関数の定義
    int basicFun(int para1)
    {
        return para1;
    }
    
    int (*fun1())(int)
    {
        return basicFun;
    }
    
    typedef int (*funPointer)(int);
    funPointer fun2()
    {
        return basicFun;
    }
    
    int main()
    {
        printf("%d
    ", fun1()(100)); printf("%d
    ", fun2()(100)); printf("%d
    ", (*fun1())(100)); printf("%d
    ", (*fun2())(100)); }

    リンク:https://www.zhihu.com/question/68252033
    5,autoとdecltypeを関数ポインタタイプに使用
    プロシージャを使用するには、decltypeが関数に作用すると、ポインタタイプではなく関数タイプが返されることに注意してください.したがって、*を追加して、関数自体ではなくポインタを返す必要があることを示します.
    ポインタ関数
    本質は関数ですが、戻り値はポインタです.宣言の形式は次のとおりです.
    int *test(.....)
    すなわち、戻り値はこの関数で定義されたポインタタイプです.