[函數指針]關於函數指針與指針函數
阿新 • • 發佈:2019-02-11
寫法 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 = □ 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; }
個人不太清楚在定義數組時,是否要標明類型和個數,我親測的,不一致的話是不行的。
本人若有錯誤,請留評論區,虛心接受,謝謝!!!
[函數指針]關於函數指針與指針函數