static 在C语言中的作用

本文详细解析了C语言中static关键字的用途,包括改变变量或函数的使用范围、生命周期及存放位置。具体介绍了static在局部变量、全局变量及函数上的应用特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过对static的理解,记录下来。总的来说,static的作用有以下3点

1.改变了他所修饰的变量或函数的使用范围

2.改变了他所修饰的变量和函数的生命周期

3.改变了他所修饰的变量和函数的存放位置


以上3点体现在以下3个地方

1.修饰局部变量

使用范围:是在该变量所在的语句块中,这个和普通变量一样。

生命周期:在程序开始时存在,一直到程序结束时才消失。

存放位置:存放在静态数据区,所以只赋了一次初值之后,以后就用该变量时就不会再次赋初值了。


2.修饰全局变量

使用范围:是在该变量所在的.c文件中,这个和全局变量有区别,全局变量,在其他.c中还可以被调用,而static修饰的全局变量则不能被其他.c文件调用。

生命周期:在程序开始时存在,一直到程序结束时才消失。

存放位置:存放在静态变量区,所以只赋了一次初值之后,以后就用该变量时就不会再次赋初值了。


3.修饰函数

使用范围:是在该函数所在的.c文件中,这个和普通函数有区别,普通函数,在其他.c中还可以调用,而static修饰的静态函数则不能被其他.c文件调用。

生命周期:在程序开始时存在,一直到程序结束时才消失。

存放位置:static函数在内存中只存在一份,而普通函数每次调用都有一份拷贝。

### C语言中 `static` 关键字的作用 在C语言中,`static` 关键字具有多种作用,主要体现在以下几个方面: #### 1. **隐藏功能** 当使用 `static` 修饰函数或全局变量时,它们的作用域将被限制在定义它们的文件内。这意味着其他文件无法通过外部链接访问这些函数或变量[^1]。例如,如果一个函数被声明为静态函数,则该函数只能在定义它的源文件中调用,而不能被其他文件中的代码调用。 #### 2. **保持持久性** 对于局部变量而言,`static` 关键字可以改变其存储方式和生命周期。通常情况下,局部变量存放在栈上,在函数执行完毕后会被销毁。然而,当局部变量被声明为 `static` 时,它会被存放在静态存储区,因此其值在整个程序运行期间都保持不变[^3]。例如: ```c int fun(int x, int y) { static int m = 0; // 静态局部变量,初始化一次且值在多次调用间保留 static int i = 2; i += m + 1; m = i + x + y; return m; } ``` 在这个例子中,`m` 和 `i` 是静态局部变量,它们的值在函数返回后不会丢失,并且在下一次调用时仍然保留上次的值[^1]。 #### 3. **默认初始化为0** 无论是全局变量还是局部变量,只要被 `static` 修饰,都会在未显式初始化的情况下默认初始化为0。这是因为静态变量存放在静态存储区,而不是栈上。 #### 4. **静态局部变量的传递** 尽管静态局部变量的作用域仅限于定义它的函数内部,但可以通过其他方式(如全局变量或返回值)将它的值传递到函数外部。例如: ```c int temp; // 全局变量 int send(int a, int b) { static int c; // 静态局部变量 c = a + b; temp = c; // 将静态局部变量的值赋给全局变量 return temp; } int main(void) { printf("%d", send(1, 2)); // 输出静态局部变量的值 return 0; } ``` 在这个例子中,虽然 `c` 是静态局部变量,但其值通过全局变量 `temp` 被传递到了函数外部[^2]。 --- ### 示例代码 以下是一个综合示例,展示了 `static` 的不同作用: ```c #include <stdio.h> // 静态全局变量 static int global_static_var = 10; // 静态函数 static void static_function() { printf("This is a static function.\n"); } // 使用静态局部变量的函数 int increment_static_local() { static int counter = 0; // 静态局部变量 counter++; return counter; } int main() { printf("Static Global Variable: %d\n", global_static_var); static_function(); // 调用静态函数 printf("First call to increment_static_local: %d\n", increment_static_local()); printf("Second call to increment_static_local: %d\n", increment_static_local()); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值