C++函數指針、指針函數、返回值為函數指針的函數
一、函數指針
函數指針是一種特殊的指針,指向函數,函數返回一個類型。
例如int (*add)(int,int)
定義了一個函數指針add,指向一個函數,函數形參是int/int,返回值是int。
例如int (*pfun)(int,int)
,意味着pfun是一個指針,指向一個函數,函數的返回值是int。
#include <iostream>
using namespace std;
int addfunc(int a, int b)
{
return a+b;
}
int main()
{
int (*add)(int, int) = addfunc; //addfunc函數名轉換成函數指針,傳遞給add
//int (*add)(int ,int) = &addfunc
int result = (*add)(1,2); //解引用函數指針,調用函數
//int result = add(1,2)
cout<<"通過函數指針調用函數得到結果"<<result<<endl;
cout<<"直接調用函數得到結果"<<addfunc(1, 2)<<endl;
return 0;
}
二、指針函數
指針函數是一種返回值為指針的函數。類型名 *函數名(函數參數列表)
,其中的優先級低於()。所以int *pfun(int,int)
等同於 int *(pfun(int,int))
,聲明了一個函數pfun,函數形參為int、int,返回值為整型指針*。
#include <iostream>
using namespace std;
int *p(int, int);
//該函數返回一個整型指針
int *f(int a, int b)
{
int *p = (int *)malloc(sizeof(int));
memset(p, 0, sizeof(int));
*p = a+b;
return p;
}
int main()
{
int *p1 = NULL;
p1 = f(1,2); //f(1,2)返回修改后的整型指針,並傳遞給p1空指針
}
三、返回值為函數指針的函數
這是一個復雜的指針函數,返回值為函數指針(返回值為指針,並且指針指向函數)。
int (*ff(int))(int *, int);
由於優先律,前者也為int (*(ff(int))(int *, int));
首先ff是函數名,ff(int)有返回值,由*可知函數返回值是指針(ff(int)當做指針變量),指針指向另一個函數,函數返回值是int。上述表達過於復雜,一般來說,我們使用typedef聲明來簡化代碼。
int (*PF)(int *, int); //PF是一個函數指針,指向一個返回值為int的函數
typedef int (*PF)(int *,int); //作用同上,PF是一個指針,指向一個函數,有返回值,返回值類型即int
PF ff(int);//PF是函數指針,作為類型來聲明ff(int)。那么ff(int)的返回值就是函數指針,即返回值為指向另一個函數的指針
//此外還有尾置指針的表示方法
auto ff(int)->int *(int *,int); //返回一個函數指針
PS 指針數組與數組指針
這里補充一下指針數組和數組指針的概念。
int *point[10];
//point是一個數組,數組的10個元素都是整型指針。(指針數組)->指針構成的數組
int (*point)[10];
//point是一個指針,指向一個含有10個元素的數組,元素都是整型。(數組指針)->數組類型的指針
總結
- 名稱后面有(),表示是函數;否則為普通變量。
- *后面出現的表示指針
- 函數名前面的void/int/char等表示返回類型