中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

C++函數(shù)指針詳解

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

學(xué)習(xí)c++的過程中,指針是難點(diǎn),熟悉了指針之后,還有一個(gè)讓人很蛋疼的難點(diǎn),那就是函數(shù)指針了。本博文詳細(xì)介紹一下常見的各種坑爹的函數(shù)指針。

至于指針的詳細(xì)學(xué)習(xí),推薦這篇博文C++指針詳解

與數(shù)據(jù)一樣,函數(shù)也有地址,函數(shù)的地址就是內(nèi)存中存放函數(shù)語言代碼的起始地址。函數(shù)指針就是指向這個(gè)地址。函數(shù)指針?biāo)赶虻念愋,就是函?shù)本身。我們知道,指針?biāo)赶蝾愋痛砹酥羔標(biāo)赶虻膬?nèi)存區(qū)域的大小。所以函數(shù)指針?biāo)赶虻念愋,就是函?shù)在內(nèi)存中所占據(jù)內(nèi)存的大小。知道了函數(shù)的起始地址和大小,所以函數(shù)指針可以很輕易的代替函數(shù)完成函數(shù)調(diào)用。

一、最簡單的函數(shù)指針

變量都包括聲明和賦值,指針不例外,函數(shù)指針也不例外。我們來看一個(gè)簡單的函數(shù):

void add(int a, int b){
    cout << a + b << endl;
}

一個(gè)簡單的加法計(jì)算并輸出到命令行的函數(shù)。

那么如何通過函數(shù)指針來調(diào)用它呢?

1、聲明:

void (*p1)(int a, int b);

函數(shù)指針的聲明很簡單,基本就是通過一個(gè)指針把函數(shù)名替換。指針p1的類型為void (*) (int a,int b),表明指針是一個(gè)指向某個(gè)函數(shù)的指針,指針指向的類型為void () (int a,int b)

2、賦值:

p1 = add;

3、也可以直接定義:

void (*p1)(int a, int b) = add;

注意,函數(shù)void add(int a,int b)的函數(shù)名add就是函數(shù)的地址。將地址add賦值給指針p1,那么就可以通過函數(shù)指針p1直接調(diào)用函數(shù)了。

4、調(diào)用:

(*p1)(1, 2);
p1(1, 2);

注意!出于歷史原因以上2種方式都是可以調(diào)用函數(shù)的。

二、包含多個(gè)函數(shù)指針的數(shù)組

有時(shí)候有這種情況,有一個(gè)數(shù)組,數(shù)組中的每個(gè)元素都是一個(gè)函數(shù)指針,該怎么定義這個(gè)數(shù)組呢?

1、解釋*p[n]和(*p)[n]

我們知道,[]運(yùn)算符的優(yōu)先級要高于*,所以,p[3]表示含有3個(gè)元素的數(shù)組,而*p[3] 前面的 ” * ” 指明了數(shù)組中元素的類型,即*p[3]表示一個(gè)指向3個(gè)指針的數(shù)組。

p[3]表示含有3個(gè)元素的數(shù)組,那么(*p)[3]就是用 *p 替換了 p,很容易想到,(*p)[3]?表示指向一個(gè)包含3個(gè)元素的數(shù)組的指針。

2、聲明:

void (*p2[2])(int a, int b);

數(shù)組名為p2,數(shù)組大小為2,數(shù)組中元素類型為void (*)(int a, int b),表明元素是一個(gè)指向某個(gè)函數(shù)的指針,指針指向的類型為void () (int a,int b)。

3、賦值:

p2[1] = add;

理解上跟上面是一樣的。

4、調(diào)用:

p2[1](2,3);
(*p2[1])(3,4);

同樣是2種方式都可以。

三、指向“包含多個(gè)函數(shù)指針的數(shù)組“的指針

這個(gè)標(biāo)題好像有點(diǎn)拗口。簡而言之,這個(gè)指針指向上文中的 “包含多個(gè)函數(shù)指針的數(shù)組” 。其實(shí)很簡單,說白了,就是把上文中的p2用一個(gè)指針來代替。

1、聲明:

void (*(*p3)[2])(int a, int b);

可以看到,無非就是把p2用*p3代替。

2、賦值,注意,既然是指針,使用前必須初始化:

p3 = &p2;
(*p3)[1] = add;

注意!既然實(shí)質(zhì)上就是把p2用*p3代替,c++11可以很簡單的這樣直接定義:auto p3 = &p2; 代替了void (*(*p3)[2])(int a, int b)= &p2;

3、調(diào)用:

(*p3)[1](1, 2);
((*p3)[1])(1, 2);

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:AngularJS+ASP.NET MVC+SignalR實(shí)現(xiàn)消息推送

下一篇:正則表達(dá)式在iOS中的運(yùn)用