C++函數指針總結

  學習c++的過程當中,指針是難點,熟悉了指針以後,還有一個讓人很蛋疼的難點,那就是函數指針了。本博文詳細介紹一下常見的各類坑爹的函數指針。html

  至於指針的詳細學習,推薦這篇博文C++指針詳解c++

  與數據同樣,函數也有地址,函數的地址就是內存中存放函數語言代碼的起始地址。函數指針就是指向這個地址。函數指針所指向的類型,就是函數自己。咱們知道,指針所指向類型表明了指針所指向的內存區域的大小。因此函數指針所指向的類型,就是函數在內存中所佔據內存的大小。知道了函數的起始地址和大小,因此函數指針能夠很輕易的代替函數完成函數調用。數組

1、最簡單的函數指針

  變量都包括聲明和賦值,指針不例外,函數指針也不例外。咱們來看一個簡單的函數:函數

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

  一個簡單的加法計算並輸出到命令行的函數。學習

  那麼如何經過函數指針來調用它呢?spa

  一、聲明:

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

  函數指針的聲明很簡單,基本就是經過一個指針把函數名替換。指針p1的類型爲void (*) (int a,int b),代表指針是一個指向某個函數的指針,指針指向的類型爲void () (int a,int b)命令行

  二、賦值:

p1 = add;

  三、也能夠直接定義:

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

  注意,函數void add(int a,int b)的函數名add就是函數的地址。將地址add賦值給指針p1,那麼就能夠經過函數指針p1直接調用函數了。指針

  四、調用:

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

  注意!出於歷史緣由以上2種方式都是能夠調用函數的。c++11

 

2、包含多個函數指針的數組

  有時候有這種狀況,有一個數組,數組中的每一個元素都是一個函數指針,該怎麼定義這個數組呢?code

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

  咱們知道,[]運算符的優先級要高於*,因此,p[3]表示含有3個元素的數組,而*p[3] 前面的 " * " 指明瞭數組中元素的類型,即*p[3]表示一個指向3個指針的數組。 

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

  二、聲明:

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

  數組名爲p2,數組大小爲2,數組中元素類型爲void (*)(int a, int b),代表元素是一個指向某個函數的指針,指針指向的類型爲void () (int a,int b)。

  三、賦值:

p2[1] = add;

  理解上跟上面是同樣的。

  四、調用:

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

  一樣是2種方式均可以。

 

3、指向「包含多個函數指針的數組「的指針

  這個標題好像有點拗口。簡而言之,這個指針指向上文中的 「包含多個函數指針的數組」 。其實很簡單,說白了,就是把上文中的p2用一個指針來代替。

  一、聲明:

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

   能夠看到,無非就是把p2用*p3代替。

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

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

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

  三、調用:

(*p3)[1](1, 2);
(*(*p3)[1])(1, 2);
相關文章
相關標籤/搜索