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);
相關文章
- [C++] 成員函式指標和函式指標C++函式指標
- c++ 函式指標C++函式指標
- C++(函式指標)C++函式指標
- 陣列,函式與指標 詳解陣列函式指標
- C++中函式指標與函式物件C++函式指標物件
- C++ 返回函式指標的函式C++函式指標
- 指標函式 和 函式指標指標函式
- 詳解c++指標的指標和指標的引用C++指標
- c++ 類的函式引用 指標C++函式指標
- c++ 智慧指標用法詳解C++指標
- 函式指標函式指標
- 匿名函式(lambda)詳解 C++函式C++
- 【不在混淆的C】指標函式、函式指標、回撥函式指標函式
- C++程式的函式指標:實操來了C++函式指標
- c++智慧指標中的reset成員函式C++指標函式
- C++ 成員函式指標簡單測試C++函式指標
- C++定義函式指標,回撥C#C++函式指標C#
- C++ 成員資料指標成員函式指標簡單測試C++指標函式
- typedef void (*Fun) (void) 的理解——函式指標——typedef函式指標函式指標
- C++指標的概念解讀 超詳細C++指標
- 函式指標&回撥函式Callback函式指標
- 指標詳解指標
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- 函式指標基礎函式指標
- 關於函式指標函式指標
- C++拷貝建構函式詳解C++函式
- C++ 數學函式、標頭檔案及布林型別詳解C++函式型別
- cpp:"函式指標"的方法函式指標
- Rust中的函式指標Rust函式指標
- C語言 函式指標C語言函式指標
- 函式指標練習題函式指標
- 函式指標的重要用途——回撥函式函式指標
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++物件導向總結——虛指標與虛擬函式表C++物件指標函式
- perl 裡邊的 函式指標函式指標
- 如何使用成員函式指標函式指標
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 從預設解構函式學習c++,new,delete,記憶體洩漏,野指標函式C++delete記憶體指標