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

C/C++ 函數指針與指針函數詳解:區別、用法與實例

     編輯:關於C語言

函數指針

定義:指向函數的指針,準確說是指向特定類型(返回值類型、參數列表一致)函數的指針。

核心特性:

  • 保存函數入口地址,可通過它調用函數。
  • 相當於給函數「取別名」。
  • 可指向一類函數,支持重新賦值(指向不同同類型函數)。

聲明與使用

int func2(int x);           // 聲明函數
int (*q2)(int x);           // 聲明函數指針 q2
q2 = func2;                 // 賦值:函數名即首地址
int c = (*q2)(3);           // 調用:解引用後傳參

指針函數

定義:返回值為指針的函數。

核心用途:

  • 解決函數需返回多個值的問題(返回結構體指針或動態分配的數組指針)。
  • 調用時用同類型指針接收返回值。

聲明與使用

int *func(int x);   // 聲明指針函數
int *q = func(3);   // 接收返回的指針

經典實例

例1:函數指針做回調(求最大值)

#include <stdio.h>
int max(int x, int y) { return x > y ? x : y; }
int min(int x, int y) { return x < y ? x : y; }

int main() {
    int (*ptr)(int, int) = max;  // 指向 max
    printf("max: %d\n", (*ptr)(3, 5));
    ptr = min;                   // 重新賦值指向 min
    printf("min: %d\n", ptr(3, 5)); // 也可省略 *
    return 0;
}

例2:函數指針數組實現簡易計算器

#include <stdio.h>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return b ? a / b : 0; }

int main() {
    int (*ops[4])(int, int) = {add, sub, mul, div};
    int a = 10, b = 5;
    for (int i = 0; i < 4; ++i)
        printf("Result %d: %d\n", i, ops[i](a, b));
    return 0;
}

例3:指針函數返回動態數組(涉及二維數組指針)

#include <iostream>
int (*find(int (*p)[4], int m))[4] {  // 返回指向 int[4] 的指針
    return p + m;
}

int main() {
    int score[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
    int (*pf)[4] = find(score, 1);    // 獲取第 2 行首地址
    for (int i = 0; i < 4; ++i)
        std::cout << *(pf[0] + i) << ' '; // 輸出 5 6 7 8
    // 關鍵句解析:pf = *(p+m); p 是 int(*)[4],p+m 跳過 m 行,* 取行首 int*
    return 0;
}

總結對比

項目函數指針指針函數
本質指針變量函數
聲明int (*p)(int);int *p(int);
用途回調、多態、狀態機返回動態內存、多值返回
優先級* 結合 ()() 優先於 *

掌握二者區別,靈活運用指針,是 C/C++ 進階的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved