程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++函數指針詳解

C++函數指針詳解

編輯:C++入門知識

C++函數指針詳解


 學習c++的過程中,指針是難點,熟悉了指針之後,還有一個讓人很蛋疼的難點,那就是函數指針了。本博文詳細介紹一下常見的各種坑爹的函數指針。     至於指針的詳細學習,推薦這篇博文C++指針詳解     與數據一樣,函數也有地址,函數的地址就是內存中存放函數語言代碼的起始地址。函數指針就是指向這個地址。函數指針所指向的類型,就是函數本身。我們知道,指針所指向類型代表了指針所指向的內存區域的大小。所以函數指針所指向的類型,就是函數在內存中所占據內存的大小。知道了函數的起始地址和大小,所以函數指針可以很輕易的代替函數完成函數調用。   一、最簡單的函數指針   變量都包括聲明和賦值,指針不例外,函數指針也不例外。我們來看一個簡單的函數:   void add(int a, int b){     cout << a + b << endl; }   一個簡單的加法計算並輸出到命令行的函數。     那麼如何通過函數指針來調用它呢?     1、聲明: void (*p1)(int a, int b);   函數指針的聲明很簡單,基本就是通過一個指針把函數名替換。指針p1的類型為void (*) (int a,int b),表明指針是一個指向某個函數的指針,指針指向的類型為void () (int a,int b)     2、賦值: p1 = add;   3、也可以直接定義: void (*p1)(int a, int b) = add;     注意,函數void add(int a,int b)的函數名add就是函數的地址。將地址add賦值給指針p1,那麼就可以通過函數指針p1直接調用函數了。     4、調用: (*p1)(1, 2); p1(1, 2);   注意!出於歷史原因以上2種方式都是可以調用函數的。       二、包含多個函數指針的數組   有時候有這種情況,有一個數組,數組中的每個元素都是一個函數指針,該怎麼定義這個數組呢?     1、解釋*p[n]和(*p)[n]   我們知道,[]運算符的優先級要高於*,所以,p[3]表示含有3個元素的數組,而*p[3] 前面的 " * " 指明了數組中元素的類型,即*p[3]表示一個指向3個指針的數組。      p[3]表示含有3個元素的數組,那麼(*p)[3]就是用 *p 替換了 p,很容易想到,(*p)[3] 表示指向一個包含3個元素的數組的指針。     2、聲明: void (*p2[2])(int a, int b);   數組名為p2,數組大小為2,數組中元素類型為void (*)(int a, int b),表明元素是一個指向某個函數的指針,指針指向的類型為void () (int a,int b)。     3、賦值: p2[1] = add;   理解上跟上面是一樣的。     4、調用: p2[1](2,3); (*p2[1])(3,4);    同樣是2種方式都可以。       三、指向“包含多個函數指針的數組“的指針   這個標題好像有點拗口。簡而言之,這個指針指向上文中的 “包含多個函數指針的數組” 。其實很簡單,說白了,就是把上文中的p2用一個指針來代替。     1、聲明: void (*(*p3)[2])(int a, int b);    可以看到,無非就是把p2用*p3代替。     2、賦值,注意,既然是指針,使用前必須初始化: p3 = &p2; (*p3)[1] = add;   注意!既然實質上就是把p2用*p3代替,c++11可以很簡單的這樣直接定義:auto p3 = &p2; 代替了void (*(*p3)[2])(int a, int b)= &p2;     3、調用: (*p3)[1](1, 2); ((*p3)[1])(1, 2);  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved