函数指针及其定义和用法,C++函数指针详解(附用法代码和注意事项)
函數指針可以像一般函數一樣,用于調用函數、傳遞參數。在如 C 這樣的語言中,通過提供一個簡單的選取、執行函數的方法,函數指針可以簡化代碼。函數指針只能指向具有特定特征的函數。因而所有被同一指針運用的函數必須具有相同的參數和返回類型。
自己總結:使用函數指針調用函數有兩種方法
1.用函數指針的解引用
(*p)(實參1,實參2···實參n);
此時,*p上一定一定要加圓括號
2.直接用函數指針的名字代替指向的函數的名稱(更加方便)
用 p(實參1,實參2···實參n)
3.函數指針要與指向的函數的返回值,形參的數目和類型都要對應
4.函數指針的指向可以發生變化
驗證的例子:
#include<iostream> using namespace std; int max(int a,int b) {return a>b?a:b; } int min(int a,int b) {return a<b?a:b; }int main() {int a=11,b=12,c,d,e;int (*p1) (int ,int);int (*p3) (int ,int);int (*p2) (int ,int,int);p1=max;//c=*p1(a,b); //這里的*p1上不加括號可以嗎 ,//不可以 //否則編譯錯誤:[Error] invalid type argument of unary '*' (have 'int')c=(*p1)(a,b);p1=min;d=(*p1)(a,b);cout<<"c="<<c<<" d="<<d<<endl; //結果:c=12,d=11/*p2=max; //不對,報錯:沒有把函數max轉化為具有三個參數的函數,所以函數指針要與對應的指向的函數的返回值和形參類型和個數都要一致 c=(*p2)(a,b); */ p3=max;e=p3(a,b); 使用函數指針調用函數max cout<<"e="<<e<<endl; //結果:e=12//說明也可以直接用函數指針的名字來代替函數名字,或許在自己定義的函數名字很長時,//用簡短的函數指針名更方便吧 return 0; }相關資料:
什么是函數指針
如果在程序中定義了一個函數,那么在編譯時系統就會為這個函數代碼分配一段存儲空間,這段存儲空間的首地址稱為這個函數的地址。而且函數名表示的就是這個地址。既然是地址我們就可以定義一個指針變量來存放,這個指針變量就叫作函數指針變量,簡稱函數指針。
那么這個指針變量怎么定義呢?雖然同樣是指向一個地址,但指向函數的指針變量同我們之前講的指向變量的指針變量的定義方式是不同的。例如:
int(p)(int, int);
這個語句就定義了一個指向函數的指針變量 p。**首先它是一個指針變量,所以要有一個“”,即(p);其次前面的 int 表示這個指針變量可以指向返回值類型為 int 型的函數;后面括號中的兩個 int 表示這個指針變量可以指向有兩個參數且都是 int 型的函數。所以合起來這個語句的意思就是:定義了一個指針變量 p,該指針變量可以指向返回值類型為 int 型,且有兩個整型參數的函數。p 的類型為 int()(int,int)。
所以函數指針的定義方式為:
函數返回值類型 (* 指針變量名) (函數參數列表);
“函數返回值類型”表示該指針變量可以指向具有什么返回值類型的函數;“函數參數列表”表示該指針變量可以指向具有什么參數列表的函數。這個參數列表中只需要寫函數的參數類型即可。
我們看到,函數指針的定義就是將“函數聲明”中的“函數名”改成“(*指針變量名)”。但是這里需要注意的是:“(*指針變量名)”兩端的括號不能省略,括號改變了運算符的優先級。如果省略了括號,就不是定義函數指針而是一個函數聲明了,即聲明了一個返回值類型為指針型的函數。
那么怎么判斷一個指針變量是指向變量的指針變量還是指向函數的指針變量呢?首先看變量名前面有沒有“”,如果有“”說明是指針變量;其次看變量名的后面有沒有帶有形參類型的圓括號,如果有就是指向函數的指針變量,即函數指針,如果沒有就是指向變量的指針變量。
最后需要注意的是,指向函數的指針變量沒有 ++ 和 – 運算。
(以上資料內容來源:
http://c.biancheng.net/view/228.html )
總結
以上是生活随笔為你收集整理的函数指针及其定义和用法,C++函数指针详解(附用法代码和注意事项)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英语 interactive tut
- 下一篇: OpenGL之glMatrixMode函