定義:指向函數的指針,準確說是指向特定類型(返回值類型、參數列表一致)函數的指針。
核心特性:
int func2(int x); // 聲明函數 int (*q2)(int x); // 聲明函數指針 q2 q2 = func2; // 賦值:函數名即首地址 int c = (*q2)(3); // 調用:解引用後傳參
定義:返回值為指針的函數。
核心用途:
int *func(int x); // 聲明指針函數 int *q = func(3); // 接收返回的指針
#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;
}
#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;
}
#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++ 進階的關鍵一步。