指針之 函數(shù)指針和指針函數(shù)


指針函數(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;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容