指針函數(shù)
定義
指針函數(shù),簡單的來說,就是一個(gè)返回指針的函數(shù),其本質(zhì)是一個(gè)函數(shù),而該函數(shù)的返回值是一個(gè)指針。
聲明格式為:*類型標(biāo)識符 函數(shù)名(參數(shù)表)
這似乎并不難理解,再進(jìn)一步描述一下。
看看下面這個(gè)函數(shù)聲明:
int fun(int x,int y);
這種函數(shù)應(yīng)該都很熟悉,其實(shí)就是一個(gè)函數(shù),然后返回值是一個(gè) int 類型,是一個(gè)數(shù)值。
接著看下面這個(gè)函數(shù)聲明:
int *fun(int x,int y);
這和上面那個(gè)函數(shù)唯一的區(qū)別就是在函數(shù)名前面多了一個(gè)*號,而這個(gè)函數(shù)就是一個(gè)指針函數(shù)。其返回值是一個(gè) int 類型的指針,是一個(gè)地址。
這樣描述應(yīng)該很容易理解了,所謂的指針函數(shù)也沒什么特別的,和普通函數(shù)對比不過就是其返回了一個(gè)指針(即地址值)而已。
指針函數(shù)的寫法
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);
這個(gè)寫法看個(gè)人習(xí)慣,其實(shí)如果*靠近返回值類型的話可能更容易理解其定義。
#include <iostream>
using namespace std;
int *GetNum(int x); //指針函數(shù)聲明形式
void main(void)
{
? ? cout << "===============start================" << endl;
? ? int num;
? ? cout << "Please enter the number between 0 and 6: ";
? ? cin >> num;
? ? cout << "result is:" << *GetNum(num) << endl;? ? //輸出返回地址塊中的值
? ? system("pause");
}
int *GetNum(int x) {
? ? static int num[] = { 0,1,2,3,4,5,6 };
? ? return &num[x];? //返回一個(gè)地址
}
函數(shù)指針
定義
函數(shù)指針,其本質(zhì)是一個(gè)指針變量,該指針指向這個(gè)函數(shù)??偨Y(jié)來說,函數(shù)指針就是指向函數(shù)的指針。
類似C#的委托
聲明格式:類型說明符 (*函數(shù)名) (參數(shù))
如下:
int (*fun)(int x,int y);
函數(shù)指針是需要把一個(gè)函數(shù)的地址賦值給它,有兩種寫法:
fun = &Function;
fun = Function;
取地址運(yùn)算符&不是必需的,因?yàn)橐粋€(gè)函數(shù)標(biāo)識符就表示了它的地址,如果是函數(shù)調(diào)用,還必須包含一個(gè)圓括號括起來的參數(shù)表。
調(diào)用函數(shù)指針的方式也有兩種:
x = (*fun)();
x = fun();
int add(int a, int b)
{
????return a + b;
}
????int max(int a, int b)
{
????return a > b ? a : b;
}
int main03()
{
//void *p(int, char *);//聲明了一個(gè)函數(shù),函數(shù)的名字叫p,函數(shù)的返回值是void *,函數(shù)的參數(shù)是int和char *
//void (*p)(int, char *);//定義了一個(gè)指向參數(shù)為int和char*,返回值為void的函數(shù)指針
//定義一個(gè)參數(shù)為int * 返回值為int *的指向函數(shù)的指針
//int *(*p)(int *);
//int *p(int *);//聲明了一個(gè)函數(shù),返回值是int *,參數(shù)是int *
//void (*p1)(int *, int);
int(*p)(int, int);//定義了一個(gè)指向函數(shù)的指針,可以指向兩個(gè)參數(shù),都是int,返回值也是int這種類型的函數(shù)
int status = 0;
scanf("%d", &status);
//p = add;//直接寫函數(shù)的名字,代表函數(shù)的地址,將add這個(gè)函數(shù)的地址復(fù)制給指針變量p
if (status == 1)
p = max;
else
p = add;
int i = 0;
i = p(5, 7);//通過指針變量間接的調(diào)用指針指向的函數(shù)
//編譯在編譯i = p(5,7)的時(shí)候,根本就不知道要調(diào)用什么代碼
printf("i = %d\n", i);
}
示例2:
int func1(int(*p)(int, int), int a, int b)//第一個(gè)參數(shù)是指向函數(shù)的指針
{
return p(a, b);//通過指向函數(shù)的指針調(diào)用一個(gè)函數(shù)
}
int main00()
{
int i = func1(add, 6, 9);//add函數(shù)在這里就叫回調(diào)函數(shù)
printf("i = %d\n", i);
return 0;
}