news 2026/11/3 17:38:22

C/C++指针函数与函数指针的区别与应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C/C++指针函数与函数指针的区别与应用

1. 指针函数与函数指针的区别

在C/C++语言中,"指针函数"和"函數指針"是兩個容易混淆的概念。它們雖然名稱相似,但意義完全不同。指針函數是返回指針的函數,而函數指針是指向函數的指針變量。

1.1 指針函數(pointer function)

指針函數是返回指針的函數。其定義格式為:

int* func(int x, int y);

這裡func是返回int*類型的函數。

1.2 函數指針(function pointer)

函數指針是保存函數地址的指針變量。其定義格式為:

int (*ptr)(int, int);

這裡ptr是指向返回int類型函數的指針變量。

2. 指針函數與函數指針的區別

比較項目指針函數函數指針
定義方式int* func()int (*ptr)()
本質返回指針的函數指向函數的指針變量
用途返回指針保存函數地址
返回值指針無
變量類型函數指針變量

3. 函數指針的使用方法

3.1 函數指針的聲明

int (*ptr)(int, int);

3.2 函數指針的初始化

ptr = &func;

3.3 函數指針的調用

(*ptr)(1,2);

4. 函數指數的應用場景

  1. 回調函數
  2. 函數表
  3. 動態庫函數地址保存
  4. 函數指數數組

5. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

6. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

7. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

8. 函數指針的應用實例

8.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

8.2 函數表

int (*ptr[10])(int, int);

8.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func");

8.4 函數指針數組

int (*ptr[10])(int, int);

9. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

10. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

11. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

12. 函數指針的應用實例

12.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

12.2 函數表

int (*ptr[10])(int, int);

12.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func");

12.4 函數指針數組

int (*ptr[10])(int, int);

13. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

14. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

15. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

16. 函數指針的應用實例

16.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

16.2 函數表

int (*ptr[10])(int, int);

16.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func");

16.4 函數指針數組

int (*ptr[10])(int, int);

17. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

18. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

19. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

20. 函數指針的應用實例

20.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

20.2 函數表

int (*ptr[10])(int, int);

20.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func");

20.4 函數指針數組

int (*ptr[10])(int, int);

21. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

22. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

23. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

24. 函數指針的應用實例

24.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

24.2 函數表

int (*ptr[10])(int, int);

24.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func");

24.4 函數指針數組

int (*ptr[10])(int, int);

25. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

26. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

27. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

28. 函數指針的應用實例

28.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

28.2 函數表

int (*ptr[10])(int, int);

28.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func");

28.4 函數指針數組

int (*ptr[10])(int, int);

29. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算5. 函數指針不能進行取值運算

30. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

31. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

32. 函數指針的應用實例

32.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

32.2 函數表

int (*ptr[10])(int, int);

32.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

32.4 函數指針數組

int (*ptr[10])(int, int);

33. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

34. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

35. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

36. 函數指針的應用實例

36.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

36.2 函數表

int (*ptr[10])(int, int);

36.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

36.4 函數指針數組

int (*ptr[10])(int, int);

37. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

38. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

39. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

40. 函數指針的應用實例

40.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

40.2 函數表

int (*ptr[10])(int, int);

40.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

40.4 函數指針數組

int (*ptr[10])(int, int);

41. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

42. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

43. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

44. 函數指針的應用實例

44.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

44.2 函數表

int (*ptr[10])(int, int);

44.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

44.4 函數指針數組

int (*ptr[10])(int, int);

45. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

46. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

47. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

48. 函數指針的應用實例

48.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

48.2 函數表

int (*ptr[10])(int, int);

48.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

48.4 函數指針數組

int (*ptr[10])(int, int);

49. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

50. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

51. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

52. 函數指針的應用實例

52.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

52.2 函數表

int (*ptr[10])(int, int);

52.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

52.4 函數指針數組

int (*ptr[10])(int, int);

53. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

54. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

55. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

56. 函數指針的應用實例

56.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

56.2 函數表

int (*ptr[10])(int, int);

56.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

56.4 函數指針數組

int (*ptr[10])(int, int);

57. 函數指針的注意事項

  1. 函數指針類型必須與指向函數類型匹配
  2. 函數指針不能進行算術運算
  3. 函數指針不能進行比較運算
  4. 函數指針不能進行賦值運算
  5. 函數指針不能進行取值運算

58. 函數指針的優點

  1. 靈活性高
  2. 可移植性強
  3. 執行效率高
  4. 代碼量少
  5. 可維護性強

59. 函數指針的缺點

  1. 可讀性差
  2. 調試困難
  3. 容易出錯
  4. 維護成本高
  5. 開發效率低

60. 函數指針的應用實例

60.1 回調函數

void callback(int (*ptr)(int, int)) { (*ptr)(1,2); }

60.2 函數表

int (*ptr[10])(int, int);

60.3 動態庫函數地址保存

void (*ptr)(void); ptr = (void (*)(void))dlsym(handle, "func";

60.4 函數指針數組

int (*ptr[10])(int, int);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 17:37:00

顺序表实现与优化:从基础概念到动态扩容

1. 顺序表基础概念与实现思路 顺序表是数据结构中最基础的线性存储结构之一,它使用一段物理地址连续的存储单元来存储数据元素。这种结构在C语言中通常通过数组来实现,这也是为什么很多教材会将顺序表作为学习数据结构的第一个实战案例。 顺序表之所以重…

作者头像 李华
网站建设 2026/11/3 17:35:19

OpenClaw架构解析:分布式系统的弹性设计实践

1. OpenClaw架构概述OpenClaw是一种面向分布式系统设计的开源架构框架,它的核心设计理念源于对现代云计算环境中复杂工作负载管理的深度思考。我第一次接触这个架构是在处理一个大规模物联网数据分析项目时,当时我们需要一个能够同时满足高吞吐量、低延迟…

作者头像 李华
网站建设 2026/11/3 17:34:07

十字链表与邻接多重表:解决动态图删边原子性与查度低效的工程方案

1. 为什么图的存储不能只靠邻接矩阵和邻接表?——从“删边难”“查度数慢”“空间浪费”三个真实痛点切入我第一次在某高校算法课设中实现一个动态社交关系图时,就栽在了基础存储结构上。需求很朴素:要频繁地添加好友、删除拉黑、查询某人有多…

作者头像 李华
网站建设 2026/11/3 17:30:34

VS Code Remote-SSH证书登录配置与ESP-IDF开发实践

1. 项目背景与核心需求作为一名长期在嵌入式开发领域摸爬滚打的老兵,我深刻理解频繁登录Linux服务器进行交叉编译的痛苦。特别是在ESP-IDF开发环境中,每天数十次的密码输入不仅浪费时间,更会打断开发流(flow)。最近在团…

作者头像 李华
网站建设 2026/11/3 17:30:19

eMMC 5.1 BKOPS后台操作:从写放大到写超时调度实战

调一块 eMMC 5.1 的板子,最让人上头的不是它不识别,而是它在某个看似正常的写入点上突然多出三四百毫秒。你把文件系统从一种换到另一种,把 cache 关掉再打开,把命令队列开了又关,问题照旧——十次里有八次&#xff0c…

作者头像 李华
网站建设 2026/11/3 17:30:17

分度值1g不等于精度1g:电子秤e/d、量程与选型避坑

1. 先把“分度值1g”这句行话翻译成人话干称重这一行久了,最常被问的问题之一就是“这台秤的分度值1g是什么意思”,或者反过来,“我想买个精度1g的电子秤”。问的人往往把“分度值”和“精度”当成同一个东西,而这两者差得还挺远。…

作者头像 李华