news 2026/4/23 14:58:25

静态static关键字:从基础到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
静态static关键字:从基础到实战

一、static 关键字在 C 语言中的应用

1、修饰局部变量

在 C 语言中,当static关键字修饰局部变量时,这个局部变量就成为了静态局部变量。与普通局部变量不同,静态局部变量存储在静态存储区,而不是栈区。这意味着它的生命周期从程序开始执行时开始,直到程序结束才结束 ,而不是在函数调用结束时就被销毁。不过,静态局部变量的作用域仍然局限于定义它的函数内部。

下面通过一个简单的计数器示例来展示static修饰局部变量的用法:

#include <stdio.h> void counter() { static int count = 0; // 静态局部变量,用于计数 count++; printf("Count: %d\n", count); } int main() { int i; for (i = 0; i < 5; i++) { counter(); } return 0; }

在上述代码中,count是一个静态局部变量。每次调用counter函数时,count的值都会保留上一次调用结束时的值,并在此基础上递增。如果count不是静态局部变量,每次调用counter函数时,count都会被初始化为 0,无法实现计数功能。运行上述代码,输出结果如下:

Count: 1 Count: 2 Count: 3 Count: 4 Count: 5

可以看到,count的值在每次调用counter函数时都得到了正确的累加,这就是静态局部变量的特性。

2、修饰全局变量

当static关键字修饰全局变量时,这个全局变量的作用域就被限制在了当前文件中,其他文件无法访问它。普通全局变量具有外部链接属性,在一个文件中定义后,其他文件可以通过extern关键字声明并使用;而被static修饰的全局变量具有内部链接属性,只能在本文件中使用。

假设有两个文件file1.c和file2.c,在file1.c中定义一个普通全局变量和一个静态全局变量:

// file1.c #include <stdio.h> int globalVar; // 普通全局变量 static int staticGlobalVar = 10; // 静态全局变量 void printVars() { printf("globalVar: %d\n", globalVar); printf("staticGlobalVar: %d\n", staticGlobalVar); }

在file2.c中尝试访问这两个变量:

// file2.c #include <stdio.h> extern int globalVar; // 声明外部变量 // extern int staticGlobalVar; // 这行代码会报错,因为staticGlobalVar是静态全局变量,作用域仅限于file1.c int main() { globalVar = 20; // staticGlobalVar = 30; // 这行代码会报错 printVars(); return 0; }

在上述代码中,globalVar是普通全局变量,在file2.c中通过extern声明后可以正常访问和修改;而staticGlobalVar是静态全局变量,在file2.c中无法访问,即使声明也会报错。这样可以避免在多文件项目中,不同文件的全局变量命名冲突,同时也提高了代码的安全性和模块化程度。

3、修饰函数

static关键字修饰函数时,这个函数就只能在当前文件中被调用,其他文件无法调用它。这与静态全局变量类似,限制了函数的作用域。普通函数具有外部链接属性,在一个文件中定义后,其他文件可以直接调用;而静态函数具有内部链接属性,只在本文件内可见。

例如,在file1.c中定义一个静态函数和一个普通函数:

// file1.c #include <stdio.h> static void staticFunction() { printf("This is a static function.\n"); } void normalFunction() { printf("This is a normal function.\n"); staticFunction(); // 在本文件内可以调用静态函数 }

在file2.c中尝试调用这两个函数:

// file2.c #include <stdio.h> // void staticFunction(); // 这行代码会报错,因为staticFunction是静态函数,作用域仅限于file1.c extern void normalFunction(); // 声明外部函数 int main() { normalFunction(); // staticFunction(); // 这行代码会报错 return 0; }

在上述代码中,normalFunction是普通函数,在file2.c中声明后可以正常调用;而staticFunction是静态函数,在file2.c中无法调用,即使声明也会报错。静态函数常用于实现一些只在本文件内部使用的辅助函数,将其隐藏起来,避免被其他文件误调用,同时也增强了代码的封装性和安全性。

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

树莓派 OS APT 源的 GPG 公钥缺失或过期

树莓派 OS APT 源的 GPG 公钥缺失或过期 APT 源的 GPG 公钥缺失或过期&#xff0c;所以 apt update 无法验证签名。树莓派 OS&#xff08;基于 Debian/Raspbian&#xff09;在 Bookworm 版本上需要手动导入最新的密钥。&#x1f527; 解决方案 1. 安装必要工具 sudo apt instal…

作者头像 李华
网站建设 2026/4/22 23:15:16

VS Code 代码片段:让你的编码效率提升 10 倍

什么是代码片段&#xff1f; 代码片段&#xff08;Snippets&#xff09;是可以让你通过简短的缩写快速插入常用代码模板的功能。 比如输入 cf 然后按 Tab 键&#xff0c;就能自动生成&#xff1a; const | () > {| }光标会停在竖线位置&#xff0c;让你直接输入函数名和函…

作者头像 李华
网站建设 2026/4/23 11:14:18

收藏!程序员转行大模型的5大黄金方向,小白也能精准入门

在科技迭代的浪潮中&#xff0c;大模型技术已成为驱动各行业智能化升级的核心引擎&#xff0c;彻底打破了传统技术的应用边界。对于程序员群体而言&#xff0c;这不仅是技术能力的全新考验&#xff0c;更是实现职业跃迁、拓宽发展赛道的绝佳窗口期。凭借扎实的编程功底与严谨的…

作者头像 李华
网站建设 2026/4/23 14:48:36

从MySQL物理外键开始的思考:数据库约束与架构设计的深层对话

引言&#xff1a;约束之美与架构之痛 在数据库设计的广阔领域中&#xff0c;外键约束一直是一个充满争议的话题。对于MySQL开发者而言&#xff0c;物理外键就像一把双刃剑——既能保证数据的完整性和一致性&#xff0c;又可能在特定场景下成为系统扩展的障碍。这篇2万字的深度…

作者头像 李华
网站建设 2026/4/23 13:03:07

SGMICRO圣邦微 SGM61412AXTN6G/TR SOT23-6 DC-DC电源芯片

特性4.5V至42V宽输入电压范围高达1.2A的电流输出1.2MHz开关频率0.83V内部参考电压SGM61412A&#xff1a;PSM和PWM模式SGM61412B&#xff1a;PFM和PWM模式低静态电流&#xff1a;55μA&#xff08;典型值&#xff09;超低关断电流&#xff1a;1.2μA&#xff08;典型值&#xff…

作者头像 李华
网站建设 2026/4/23 12:36:44

SGMICRO圣邦微 SGM66052-ADJYUDR6G/TR UTDFN-21.5-6L DC-DC电源芯片

特性2.2V至5.2V输入电压范围5.1V固定输出电压6V输出电压钳位可调输出电压高达5.2V效率高达90%器件静态电流20μA&#xff08;典型值&#xff09;关断电流1μA&#xff08;最大值&#xff09;采用节能模式&#xff08;PSM&#xff09;提高轻载效率关机时负载断开当VOUT > VIN…

作者头像 李华