1. 程式人生 > >[函數指針]關於函數指針與指針函數

[函數指針]關於函數指針與指針函數

寫法 mes 名稱 warning 參數類型 ces cal write while

指針函數

指針函數顧名思義,本質還是函數,不同的是改函數的返回類型為指針類型。接下來我們舉個例子。

#include <iostream>
using namespace std;

char *Output()
{
    return "success!!!";
}

int main()
{
    cout << "執行Output函數的結果是:" << Output() << endl;
    return 0;
}

這裏的 char *Output(); 就是個指針函數——char*的函數,即返回值為char*類型的。(這裏的代碼,如果gcc/g++版本比較高的話,可能會有警告)

warning: deprecated conversion from string constant to char* [-Wwrite-strings]

函數指針

同上我就不再贅述,本質是指針。接下來我們同樣拿代碼實例。

#include <iostream>
using namespace std;

int square(int num)
{
    return num * num;
}

int main()
{
    int num;
    int (*p)(int); //這裏表示指針名為p,傳入的參數類型為int類型的

    cout << "
請輸入一個整數:"; cin >> num; //p = &square; p = square; //這裏可以用上面一種寫法,但是函數名就相當與首地址,所以省略。 cout << num << " * " << num << " = " << (*p)(num) << endl; //這裏也可以寫為p(num),但是像普通的函數調用 return 0; }

這是兩者的寫法上的差別:

指針函數:int *p();

函數指針:int (*p)();

擴展

1.函數指針作為參數

#include <iostream>
using namespace std;

int add(int num1, int num2)
{
    return num1 + num2;
}

int sub(int num1, int num2)
{
    return num1 - num2;
}

int calc(int (*p)(int ,int ), int num1, int num2)
{
    return (*p)(num1, num2);
}

int main()
{
    cout << "1 + 2 = " << calc(add, 1, 2) << endl;//調用calc,第一個參數為函數名
    cout << "1 - 2 = " << calc(sub, 1, 2) << endl;
    return 0;
}

2.函數指針作為返回值

#include <iostream>
using namespace std;

int add(int num1, int num2)
{
    return num1 + num2;
}

int sub(int num1, int num2)
{
    return num1 - num2;
}

int calc(int (*p)(int ,int), int num1, int num2)
{
    return (*p)(num1, num2);
}

int (*select(char op))(int, int)//函數指針作為返回值
{
    switch(op)
    {
        case + : return add;
        case - : return sub;
    }
}

int main()
{
    int num1, num2;
    char op;
    int (*p)(int, int);//定義一個函數指針

    cout << "請輸入一個公式(例如:3+3):";
    cin >> num1 >> op >> num2;

    p = select(op);
    cout << p << endl;//這裏好奇的輸出p,結果答案為1,不清楚怎麽回事
    cout << num1 << " " << op << " " << num2 << " = " << (*p)(num1, num2) << endl;
    return 0;
}

這裏我來解釋一下 int (*select(char op))(int, int); 的構成,把該式子看成 int (*)(int, int);,這是不是函數指針了。為什麽這麽處理了。在C/C++ 中括號是有結合性和優先級的,括號內的select是函數的名稱,char op是參數,*是返回類型,*具體返回的是什麽呢,就是我們拆分的式子。

3.回調函數(在一個項目文件下)

//1.cpp
#include <iostream>
using namespace std;
extern void fun(void(*p)(int));

static void Output(int a)//被static修飾後,外部文件不能直接調用
{
    cout << a << endl;
}

int main()
{
    fun(Output);
    return 0;
}
//2.cpp
void fun(void (*p)(int))
{
  p(200);
}

這個例子比較繞,在1.cpp中調用2.cpp中的fun()函數,該函數的參數為函數指針,回到1.cpp中調用Output函數,最後輸出該值。

調用fun() ——函數指針——> fun() ——回調——> Output()

4.函數指針數組

#include <iostream>
using namespace std;

int add(int num1, int num2)
{
    return num1 + num2;
}

int sub(int num1, int num2)
{
    return num1 - num2;
}

int main()
{
    int i = 0, value;
    int data1, data2;
    int (*p[2])(int, int) = {add, sub};

    do{
        cout << "1: add" << endl;
        cout << "2: sub" << endl;
        cout << "else: exit" << endl;
        cout << "請選擇:"  << endl;
        cin >> i;

        cout << "input data1, data2:" << endl;
        cin >> data1 >> data2;
        value = p[i-1](data1, data2);

        cout << "值為:" <<value << endl;
    }while(i == 1 || i==2);
    return 0;
}

個人不太清楚在定義數組時,是否要標明類型和個數,我親測的,不一致的話是不行的。

本人若有錯誤,請留評論區,虛心接受,謝謝!!!

[函數指針]關於函數指針與指針函數