C语言详解关键字-static

static关键字在C语言中用于修饰变量和函数,影响其作用域和生命周期。静态局部变量只在定义它的函数内可见,且生命周期贯穿整个程序,常用于函数间数据持久化。静态全局变量限制了其作用域为定义它的文件,而静态函数则只能在定义的源文件内被调用。这些特性增强了代码的封装性和模块化。

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

在C语言中,static是一个关键字,具有很多重要的用途,本文将对其进行详细介绍。
static关键字是用来修饰变量和函数的

  1. 修饰局部变量称为静态局部变量
  2. 修饰全局变量称为静态全局变量
  3. 修饰函数称为静态函数

静态变量

在C语言中,使用static关键字定义的局部变量属于静态变量,也称为内部链接变量。这些变量仅在定义它们的函数或文件中可见,不能被其他文件访问。静态变量的生命周期与程序相同,并且只会被初始化一次。静态变量通常用于在函数之间传递数据或保存在函数调用之间保留下来的数据。
image.png
上述代码中,a是一个静态局部变量,自从第一次调用函数a被初始化,以后每次调用函数都不会在初始化a,因为a在函数调用完后不会被销毁,而是会保留数据进行下一次函数调用,从而实现在函数之间传递数据或保存在函数调用之间保留下来的数据。

本质上是:在编译环节的编译阶段编译器就会为被 static 修饰的局部变量分配空间,所以C程序在运行的过程中会直接跳过 static 修饰的语句,也就是说,在第二次及以上甚至第一次调用 test 函数时 static int a = 0; 这条语句都不会被执行。

静态函数

在C语言中,使用static关键字定义的函数属于静态函数,也称为内部链接函数。这些函数仅在定义它们的文件中可见,不能被其他文件调用。静态函数通常用于使代码更加模块化和安全。
没有static修饰的函数在同一项目不同源文件中可见,可以被调用。
image.png
static关键字定义的函数属于静态函数,这些函数仅在定义它们的文件中可见,不能被其他文件调用。
image.png

静态全局变量

在C语言中,使用static关键字定义的全局变量叫静态全局变量,也称为内部链接全局变量。这些变量与静态变量类似,但它们的作用域是整个文件,而不是函数。静态全局变量的值只会被初始化一次,并且只能在定义它们的文件中访问。
没有static修饰的全局变量的作用域是整个项目,具有外部链接属性,但在不同源文件使用需要用关键字extern声明变量。
image.png
static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性,这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了,感觉像是作用域变小了。
image.png

内存分布

内存大致可以分为三个区域:栈区,堆区和静态区,各区所存储的变量如下图所示。
注意:这只是一种粗略,简单的划分。
局部变量分配在栈区,全局变量分配在静态区。
ed0246ccb3a64de94c77718b86e92057.png

总结

1、 全局变量和函数是可以跨文件访问的,因为有一定规模的项目,一定是多文件的,多个文件之间,后续一定要进行数据“交互” ,如果不能跨文件访问,数据"交互"成本会非常高,所以C语言在设计的时候就规定了全局变量和函数可以跨文件访问(全局变量需要extern关键字声明)

2、 static 修饰局部变量的作用:改变局部变量的生命周期本质上是改变了局部变量的存储位置,让局部变量不再是在栈区上开辟空间,而是直接在静态区上开辟空间,从而使得局部变量拥有和全局变量一样的生命周期,即随着整个程序生成和销毁。

3、static 修饰全局变量的作用:**改变了全局变量的外部链接属性(**可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问)。

4、static 修饰函数的作用是:改变了函数的外部链接属性(可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问)。

### C语言 `static` 关键字的作用与使用场景 #### 静态局部变量 当在一个函数内部定义了一个带有 `static` 的局部变量时,该变量会在整个程序运行期间一直存在,而不是像普通局部变量那样仅存在于函数调用期间。这种特性使得静态局部变量可以在多次函数调用间保留其值[^3]。 以下是实现计数功能的一个例子: ```c #include <stdio.h> void count(); int main(void) { int i = 0; for (i = 0; i <= 5; i++) { count(); } return 0; } void count() { static int num = 0; // 声明一个静态局部变量 num++; printf("%d\n", num); } ``` 在这个例子中,每次调用 `count()` 函数时,`num` 变量都会自增并打印当前值,而不会重置为初始值。 --- #### 静态全局变量 如果在文件范围内定义了一个带 `static` 的变量,则这个变量只对该源文件可见,无法被其他文件访问。这有助于减少命名冲突,并控制变量的可见范围[^1]。 以下是一个简单的示例: ```c // file1.c static int secret = 42; void show_secret() { printf("Secret is %d\n", secret); } // file2.c 中尝试访问 secret 将失败 ``` 在这种情况下,即使两个不同的 `.c` 文件中有同名的变量,也不会发生冲突,因为它们的作用域被限制在各自的文件内。 --- #### 静态函数 通过在函数前加上 `static` 关键字,可以使该函数只能在其所在的源文件中被调用,外部文件无法直接访问它。这种方式常用于模块化设计,隐藏不必要的细节[^2]。 例如: ```c // utils.c static void helper_function() { printf("This function cannot be called from other files.\n"); } void public_function() { helper_function(); // 能够正常调用 } // main.c 中试图调用 helper_function 将报错 ``` 在这里,`helper_function` 是私有的,只有在同一文件内的其他函数才能调用它。 --- #### 生命周期和存储位置 无论是在哪个上下文中使用的 `static` 关键字,其所修饰的对象均具有 **静态存储期** 和固定的内存地址,在程序启动时分配空间,并在整个程序执行过程中持续占用这些资源直到结束[^4]。 对于静态局部变量来说,尽管它的作用域局限于所在函数体内,但由于它是静态存储类别,因此实际存放在数据段而非栈区;而对于静态全局变量以及静态函数而言,它们同样位于数据段或者代码段之中视具体情况而定。 --- #### 总结 综上所述,`static` 主要用来调整变量或函数的作用域及其生命周期: - 对于局部变量,赋予其持久性; - 对于全局变量,限定其作用域至单一翻译单元; - 对于函数,使其成为文件级别的私有成员。 以上便是关于 C 语言中 `static` 关键字较为全面的理解方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值