首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 函數指針詳解:typedef 定義與用法差異

     編輯:關於C++

背景

在閱讀 libcurl 源碼時發現其函數指針定義方式與常見寫法不同,經分析發現兩種定義方式均合法。

兩種定義方式

常見寫法(帶指針符號):

typedef int (*pFunc)(int); // pFunc 是函數指針類型

libcurl 風格(無指針符號,直接定義函數類型):

typedef ssize_t (Curl_send)(struct connectdata *conn, int sockindex, const void *buf, size_t len, CURLcode *err);
// 此時 Curl_send 是一個函數類型,而非指針類型
// 使用時需顯式加指針:Curl_send *send[2];

驗證代碼

#include <iostream>
using namespace std;

int testFunc(int para) {
    cout << "parameter is: " << para << endl;
    return 0;
}

int main() {
    // 方式 1:定義函數類型,再加指針
    typedef int (pTestFunc)(int);
    pTestFunc *pFunc = testFunc;   // 初始化
    pFunc(1111);                   // 調用
    (*pFunc)(2222);                // 解引用調用
    pTestFunc *pFunc2 = &testFunc; // 取地址初始化
    pFunc2(3333);

    // 方式 2:傳統定義函數指針類型
    typedef int (*pTestFunc2)(int);
    pTestFunc2 pFunc3 = testFunc;
    pFunc3(1111);
    (*pFunc3)(2222);
    pTestFunc2 pFunc4 = &testFunc;
    pFunc4(3333);
    return 0;
}

結論

  • 定義函數類型(無 `*`)後,聲明指針變量需顯式加 `*`。
  • 定義函數指針類型(帶 `*`)後,聲明變量無需加 `*`。
  • 兩種方式在 C 和 C++ 中均受支持,調用語法(直接調用或解引用調用)均合法。
  • libcurl 採用第一種方式,便於在結構體中聲明指針數組。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved