簡析C++函數指標

來源:互聯網
上載者:User

標籤:

函數指標憑藉其絢麗的外表迷惑了同學們很久,這一篇文章力爭讓同學們徹底明白函數指標的用法。

首先有兩點是必須明白的,不明白也得先記住。

  1. 函數指標的形態
  2. C/C++ 標示符類型的定義規則
聲明函數指標的形態如下
char (*f_ptr)(int, double);//傳回型別 (*標示符)(形參列表)
也就是說,與其他普通型別宣告方法不同,函數指標的聲明並不是 [ 類型 標示符 ](如 int a)的形式。這樣聲明表達的意思是: f_ptr 是一個函數指標,指向一個函數的地址。
C/C++ 標示符的聲明規則又是什麼呢,通俗的講:對於一個聲明標示符的語句,去掉分號與標示符本身,剩下的就是此標示符的類型。按照這句話處理面函數指標的聲明語句,就得到了
char (*)(int,double)
這就是 f_ptr 的類型回憶 f_ptr 的調用方法
  1. 取解,獲得該地址對應的函數
  2. 傳參調用
由於括弧 ( ) 的優先順序高於 * ,因此取解必須加括弧
char res = (*f_ptr)(1, 2.5);


下面通過三個例子來進一步說明函數指標的用法
void func1(int k){printf("%d in func 1\n",k);}int main(){/**直接法:聲明並初始化一個函數指標,然後調用*/void (*fp)(int) = &func1;(*fp)(2);/**使用類型定義簡化聲明將類型標識 fp_type 定義為 void (*)(int),然後定義函數指標 */typedef void(*fp_type)(int);fp_type fp2 = &func1;(*fp2)(3);/**類型轉換法:將一個 void * 指標 轉化為函數指標的類型 使用 (轉化類型)轉換對象 格式*/void* fp3 = &func1;(*(void(*)(int))fp3)(4);system("pause");}


怎麼樣,是不是覺得會使用函數指標了?明白了類型與標示符的關係,下次筆試讓你寫一個參數為函數指標的函數指標數組就不用怕了。
void (*b[10]) (void (*)());

函數指標有趣的例子還很多,在 這篇部落格 看到一個。問:signal 是什麼含義
void (*signal(int,void(*)(int)))(int);
在這裡,signal不是函數指標,就是一個函數,其返回值是一個函數指標,怎麼分析呢?首先看最外層 void (* BLABLA) (int),這就說明 BLABLA 是個函數指標而 BLABLA 是 signal(int, 指標),很明顯 “標識符(類型)”是函數簽名的樣子,而代表的含義正是這個函數的返回值。
歡迎指正!

簡析C++函數指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.