news 2026/5/20 8:19:01

[技术讨论] 【C语言实战经验7】指针函数的常见应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[技术讨论] 【C语言实战经验7】指针函数的常见应用
顾名思义,所谓的指针函数,也就是函数返回值类型为指针类型(返回地址)的函数,函数格式差不多就是下面这个造型:
数据类型 *函数名(形参1, …, 形参n );
或者更直观更易看懂的造型:
(数据类型 *) 函数名(形参1, …, 形参n );
其中数据类型可以为基本数据类型(整型,浮点型等),如下声明一个返回整型指针的指针函数:
复制
  1. int*add(inta,intb); 或者
  2. (int*)add(inta,intb);
也可以为复合数据类型(最常用的应该就是结构体类型),如下声明一个返回结构体指针的指针函数:
复制
  1. ST_DEVICE_STATUS*get_device_status(void); 或者
  2. (ST_DEVICE_STATUS*) get_device_status(void);
其中ST_DEVICE_STATUS为结构体类型。
那究竟指针函数有哪些应用呢?
指针函数一般可以用来返回字符串和全局变量地址或者返回结构体指针等。
1、返回字符串和全局变量地址
可以直接返回字符串常量的地址:
复制
  1. char*getMessage(void)
  2. {return"Hello World";// 字符串常量存储在静态区
  3. }

可以直接返回全局变量的地址:
复制
  1. intg_Value;
  2. int*getValue(void)
  3. {return&g_Value;
  4. }

上面为什么强调说是返回全局变量的地址呢?局部变量不行吗?
是的,不能通过上面的方式返回局部变量的地址,因为局部变量在函数结束的时候其生命周期也跟着结束了,返回的局部变量指针会变成所谓的悬垂指针(Dangling Pointer),此时你可能会正常读取到局部变量的值(但这并不代表代码正确),也可能会读取到垃圾值,甚至是程序崩溃,即所谓的未定义行为,我们来实际测试,看下结果:
复制
  1. int*getValue(void)
  2. {
  3. intl_value =100;//定义一个局部变量,并初始化为100
  4. return&l_value;//尝试返回局部变量的地址
  5. }
程序编译无错误,但直接来一条警告信息,说明这种操作就存在风险了:

所以说,程序编译时我们也需要关注一下警告信息,不能只关注错误信息。
至于程序运行结果是不是100,咱们就不看了。
2、返回结构体指针
返回结构体指针其实也是指针函数的很常见的应用,它可以以一个简单操作对全局结构体变量的数据进行读写操作,非常方便;并且避免了直接暴露全局结构体变量到程序代码中。
我们来看下代码:
复制
  1. //定义一个结构体,记录和更新设备相关的状态信息
  2. typedefstruct
  3. {
  4. uint8_tdevice_status_error;
  5. uint8_tdevice_status_alarm;
  6. uint8_tdevice_status_warning;
  7. } ST_DEVICE_STATUS;
  8. //定义一个全局结构体变量,记录设备状态信息
  9. ST_DEVICE_STATUS g_stDeviceStatus;
  10. //定义一个指针函数,返回设备状态结构体指针数据
  11. (ST_DEVICE_STATUS *) getDeviceStatus(void)
  12. {
  13. return&g_stDeviceStatus;
  14. }
  15. //使用指针函数
  16. voidfunc(void)
  17. {
  18. ST_DEVICE_STATUS *pDeviceStatus;
  19. pDeviceStatus = getDeviceStatus();
  20. //读设备状态(读操作),相当于直接读全局变量g_stDeviceStatus
  21. if(pDeviceStatus-> device_status_error)
  22. {
  23. }
  24. elseiif(pDeviceStatus-> device_status_alarm)
  25. {
  26. }
  27. //清除设备状态(写操作),相当于直接写全局变量g_stDeviceStatus
  28. pDeviceStatus-> device_status_error =0
  29. pDeviceStatus-> device_status_alarm =0
  30. }
以上的代码通过指针函数的方式封装了全局结构体变量,除了指针函数里直接操作了全局变量,其余代码完全不需要直接操作全局变量,不仅方便读写,也增强了代码的可维护性和可读性。再给大家看下作者开发的实际项目代码:

另外,还可以用来创建链表节点,看下面代码:
复制
  1. //定义一个指针函数,创建链表节点
  2. structNode* createNode(intdata)
  3. {structNode* node = (structNode*)malloc(sizeof(structNode)); node->data = data;returnnode;// 返回结构体指针
  4. }
但是使用指针函数时也需要注意以下几点:
1、如前文所述,一定要注意,不要试图返回一个局部变量的地址;
2、函数返回值的类型和定义的类型一定要匹配;
3、要注意区分指针函数和函数指针,后续文章会介绍函数指针,以下的对比基本上就可以看出两者的区别:
名称
基本格式
描述
原因
指针函数
int * func(int a, int b) 或者
(int *)func(int a, int b)
本质是一个函数,返回指针的函数
括号优先级大于*,func会先与右边结合,构成一个func函数
函数指针
int (*func)(int a, int b)
本质是一个指针,指向函数的指针
*func是一个整体,指向int (int a, int b)函数的一个指针


---------------------
作者:dffzh
链接:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3461016
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

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

AI论文降重与写作工具推荐:8个热门网站详细对比

在众多AI论文工具中,选择一款适合自己需求的平台可能令人眼花缭乱。本文将对比8款热门工具,重点聚焦降重、降AIGC率、写论文等功能。工具排名基于实测数据和用户反馈,确保客观实用性。以下是简要排行表(基于效率、准确性和易用性&…

作者头像 李华
网站建设 2026/5/13 9:23:25

Arduino IDE实现ESP32开发环境搭建的全面讲解

从零开始搭建 ESP32 开发环境:Arduino IDE 实战全指南 你是不是也曾在某天晚上,满怀期待地打开电脑,插上刚买的 ESP32 开发板,准备开启你的物联网项目——结果却发现 Arduino IDE 根本找不到板子?串口报错、驱动装不上…

作者头像 李华
网站建设 2026/5/20 3:07:32

paperzz 接招:毕业论文这关,不用 “熬” 着过

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 当宿舍楼道的灯连熬一周没暗过,当咖啡罐堆成小山、文献综述写了删到只剩标题 —— 你大概也进入…

作者头像 李华
网站建设 2026/5/17 4:51:08

机器人“奥运会”登陆!CES Asia 2026角逐消费级机器人王座

2026年6月10日至12日,亚洲顶级消费电子盛会CES Asia(赛逸展)将在北京亦创会展中心盛大启幕!本届展会重磅推出全球消费级机器人性能挑战赛——“智创巅峰机驭未来”,以“家庭助手”“教育伴侣”等细分赛道为核心&#x…

作者头像 李华