核心内容摘要
78赛进13:一次穿越时空的奇遇,与未知的灵魂擦肩
static 关键字在 C 语言中的应用
修饰局部变量在 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函数时都得到了正确的累加这就是静态局部变量的特性。
修饰全局变量当static关键字修饰全局变量时这个全局变量的作用域就被限制在了当前文件中其他文件无法访问它。
普通全局变量具有外部链接属性在一个文件中定义后其他文件可以通过extern关键字声明并使用而被static修饰的全局变量具有内部链接属性只能在本文件中使用。
假设有两个文件file
c和file
c在file
c中定义一个普通全局变量和一个静态全局变量// file
c #include stdio.h int globalVar; // 普通全局变量 static int staticGlobalVar 10; // 静态全局变量 void printVars() { printf(globalVar: %d\n, globalVar); printf(staticGlobalVar: %d\n, staticGlobalVar); }在file
c中尝试访问这两个变量// file
c #include stdio.h extern int globalVar; // 声明外部变量 // extern int staticGlobalVar; // 这行代码会报错因为staticGlobalVar是静态全局变量作用域仅限于file
c int main() { globalVar 20; // staticGlobalVar 30; // 这行代码会报错 printVars(); return 0; }在上述代码中globalVar是普通全局变量在file
c中通过extern声明后可以正常访问和修改而staticGlobalVar是静态全局变量在file
c中无法访问即使声明也会报错。
这样可以避免在多文件项目中不同文件的全局变量命名冲突同时也提高了代码的安全性和模块化程度。
修饰函数static关键字修饰函数时这个函数就只能在当前文件中被调用其他文件无法调用它。
这与静态全局变量类似限制了函数的作用域。
普通函数具有外部链接属性在一个文件中定义后其他文件可以直接调用而静态函数具有内部链接属性只在本文件内可见。
例如在file
c中定义一个静态函数和一个普通函数// file
c #include stdio.h static void staticFunction() { printf(This is a static function.\n); } void normalFunction() { printf(This is a normal function.\n); staticFunction(); // 在本文件内可以调用静态函数 }在file
c中尝试调用这两个函数// file
c #include stdio.h // void staticFunction(); // 这行代码会报错因为staticFunction是静态函数作用域仅限于file
c extern void normalFunction(); // 声明外部函数 int main() { normalFunction(); // staticFunction(); // 这行代码会报错 return 0; }在上述代码中normalFunction是普通函数在file
c中声明后可以正常调用而staticFunction是静态函数在file
c中无法调用即使声明也会报错。
静态函数常用于实现一些只在本文件内部使用的辅助函数将其隐藏起来避免被其他文件误调用同时也增强了代码的封装性和安全性。