当前位置: 首页 > news >正文

C语言关于函数传参和返回值的一些想法2(参数可修改的特殊情况)

我最近写了一篇文章名为“C语言关于函数传参和返回值的一些想法”(C语言关于函数传参和返回值的一些想法-CSDN博客),里面提到了一种观点就是传参的参数在函数体内部是只读的,不能写它,因为如果写了,也就是污染了传参值,再也找不到了。正确的做法是定义对应栈内存(也是就临时变量),并完成一份拷贝。(拷贝的意思是不同的内存变量,但是数据内容是一致的),在函数体内部使用这一份拷贝来操作。

我最近在拜读一些前同事写的函数,发现也有某些特殊情况,直接使用了参数变量进行写操作,我想补充的是这样操作的前提是程序员知道对参数进行写操作,在函数体内部相关操作不会有影响,才能操作。我还是建议在函数体内部准备一份拷贝,操作这一份拷贝变量。

案例1:ucoss-ii中恢复优先级的操作

该案例中传参的prio如果是OS_PRTO_SELF,那么需要查询OSTCBCur指向结构体的成员值,然后对prio进行写操作,也就是对参数变量进行写操作了,不过写了prio的新值后对后面的相关操作无影响。正规写法是应以一个INT8U prio_temp的栈内存,然后将查询的OSTCBCur->OSTCBPrio值写到这里面去,然后操作这个变量。

案例2:LCD1602驱动函数,打印字符串

void write_lcd_s(INT8U y,INT8U x,char *s) reentrant
{INT8U add = x;if(y == 0)add += 0x80;else add += 0xc0;lcd_write_com(add);while(*s){lcd_write_data(*s++);       /**这里参数也改变了,不过没有影响,当然常规的写法是定义一个临时变量 */}
}

最后while(*s)循环中lcd_write_data(*s++)对参数s的值进行自加运算,用于指向下一个字符。这样操纵也是可以的,因为参数的传参的值已经没用了,而这里需要的是新值。

总结:函数传参后参数大部分情况是只读的,因为在函数体内如果对参数再写操作,传参值就丢失了,找不到了。如果对参数再次写操作,而且无影响,也是可以写的,不过这种写法的前提就是函数调用的一次传参数值确定是没用了。正规的做法就是定义一个临时变量,然后将参数的值写到这个临时变量中,我们在后面的操作去操作这个栈变量。

最后,充分理解“拷贝”的深层含义,意思是:不同的存储介质,但是存储大小,存储类型,以及存储内容是一致的。

http://www.dtcms.com/a/339194.html

相关文章:

  • 从数据孤岛到实时互联:Canal 驱动的系统间数据同步实战指南
  • 在职老D渗透日记day21:sqli-labs靶场通关(第27a关)get联合注入 过滤select和union “闭合
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述)
  • Milvus 向量数据库中的索引类型
  • SQL 语句进阶实战:从基础查询到性能优化全指南
  • K8s命名空间:资源隔离与管理的核心
  • 轻量级milvus安装和应用示例
  • 一文精通 Swagger 在 .NET 中的全方位配置与应用
  • 软件测试-Selenium学习笔记
  • Dify-MCP服务创建案例
  • 循环高级综合练习①
  • 46 C++ STL模板库15-容器7-顺序容器-双端队列(deque)
  • 人工智能统一信息结构的挑战与前景
  • Vue3编程中更多常见书写错误场景
  • 使用OpenCV计算灰度图像的质心
  • 云原生堡垒机渗透测试场景
  • 所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
  • 微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态
  • 大模型微调RAG、LORA、强化学习
  • 如何使用VNC对openEuler系统进行远程图形化操作
  • Ubuntu Server 22.04 k8s部署服务较时,文件描述符超过限制的处理方法
  • RabbitMQ:SpringBoot+RabbitMQ 多消费者绑定同一队列
  • Node.js 在 Windows Server 上的离线部署方案
  • leetcode349. 两个数组的交集
  • 轻度娱乐浪潮下定制开发开源AI智能名片S2B2C商城小程序的机遇与策略
  • 厚板数控矫平机的“第三堂课”——把视角拉远,看看它如何重塑整条制造链
  • 供水设备智慧化管理物联网解决方案:远程监控与运维
  • 搭建最新--若依分布式spring cloudv3.6.6 前后端分离项目--步骤与记录常见的坑
  • BKP相关知识点
  • 从机器视觉到图像识别:计算机视觉的多维探索