函数内使用全局变量是否生成本地副本?引用/指针参数定义合理性探讨
关于全局变量在函数中的使用疑问解答
一、函数内使用全局变量时的访问方式
函数内部直接使用全局变量时,不会创建本地副本,而是直接访问全局变量本身。
全局变量在程序启动时就被分配了固定的内存地址(比如单片机RAM的特定区域,或是映射外设的寄存器地址),函数里对它的读写操作都是直接作用于这个内存地址上的数据,和传递参数时在栈上创建临时副本的机制完全不同。
举个简单的C语言示例:
int global_counter = 0; // 全局变量 void increment_counter() { global_counter++; // 直接修改全局变量本身 } int main() { increment_counter(); // 此时global_counter的值为1,而非初始的0 return 0; }
二、将全局变量以引用&或指针*作为函数参数的意义
这么做是有意义的,具体取决于你的代码场景:
- 提升代码可读性与通用性:如果函数原本是为操作局部变量设计的,现在要复用它来操作全局变量,传递引用/指针无需大幅修改函数逻辑;同时看函数参数就能明确它要操作的变量,比函数内部直接硬编码全局变量更清晰。
- 灵活切换操作对象:同一个处理函数,既可以操作全局变量A,也可以操作全局变量B,通过传递不同的指针/引用就能实现,不用重复编写几乎相同的函数。
- 适配单片机外设场景:在单片机开发中,很多全局变量是映射到外设寄存器的(比如GPIO、UART的控制寄存器),传递指针的话,同一个函数可以统一处理不同的外设寄存器,大幅提升代码复用性。
当然,如果函数从一开始就只打算固定操作某一个全局变量,那这种写法确实没必要,反而会增加不必要的代码复杂度。
内容的提问来源于stack exchange,提问作者shyney
相关产品推荐
相关产品推荐

