C语言中static的用法与作用

static关键字在C语言中用于修饰局部变量、全局变量和函数,它可以改变局部变量的生命周期,使其在程序结束时才销毁,而不是离开作用域时。对于全局变量,static使其变为内部链接,限制其作用域仅在当前源文件。同样,static修饰的函数也只在定义它的源文件中可见。这涉及到内存的栈区、堆区和静态区的管理。
摘要由CSDN通过智能技术生成

C语言中static是一个较为重要的关键字。接下来我将从static的修饰的对象,作用来介绍static关键字。

static修饰的对象

  • 局部变量
  • 全局变量
  • 函数

static 的作用

1.static修饰局部变量

static修饰局部变量时,其作用是将该局部变量在离开该局部变量的作用域时,阻止该局部变量将其所占的内存空间还给系统。接下来就请看下面这两串代码。

对于第一段代码,fun函数总共被调用了5次,每一次对fun函数调用完之后,变量a的值就会被销毁一次,即当a出了fun函数这个作用域时,变量a就会将a所占用的内存重新还给系统。因此在每次重新调用fun函数时,a都会被重新创建(即a是不同的a),所以a的初始值总是为5,++a后其值变为6,所以每次打印的值都为6.

而在第二段代码中变量a前面被static所修饰,因此在每一次fun函数被调用完之后,a出了作用域之后其并没有被销毁,其所占的内存仍然存在(即a是同一个a),因此,每一次调用fun函数时a的值 都是前一次fun函数结束时a的值。所以打印的数值为“6 7 8 9 10”。简单来说,static修饰局部变量时,延长了其生命周期,使局部变量直到程序结束才会销毁(但并未改变局部变量的作用域)。

从内存上来看:计算机内存大致分为三部分:栈区,堆区,静态区。

栈区:局部变量,形式参数...
堆区:malloc,calloc,realloc...
静态区:全局变量,静态变量...

其中临时作用的变量都是在栈区,其特点就是变量在进入作用域时创建,离开作用域时就会销毁(即将所占内存还给操作系统)。而全局变量等生命周期长的变量存放在静态区内,其特点就是变量创建好之后,直到程序结束才会被销毁。因此,被static修饰的局部变量就会成为静态变量,从栈区中拿出来放在静态区

2.static修饰全局变量

static修饰全局变量时,该变量也可叫做静态全局变量。

如当我们在同一个文件下创建多个源文件时, 因为全局变量具有外部链接属性,所以全局变量可以通过extern这一声明外部符号在不同的源文件中使用。例如下面这一代码图:

但是,当全局变量被static修饰时,该全局变量的外部链接属性就被改变成了内部链接属性,就只能在其所在的源文件中使用。因此全局变量的作用域变小了,但并未改变它的存储位置(始终都在静态区内)。列如下面这一代码图

 

3.static修饰函数 

static修饰函数与static修饰全局变量的作用非常相似,都是使其修饰的变量与函数只能在其所在的源文件中使用。多说无益,直接给大家上图:

  

 

 重点:

  1. static修饰的全局变量虽然该变量其生命周期,却并未改变其作用域,这是与全局变量最本质的区别。
  2. static修饰全局变量时只是改变了它的外部链接属性,并没有改变它在系统中的存储位置,其存储位置始终都在静态区内。
  3. 当用static修饰了全局变量和函数后,其他文件里再定义同名的全局变量和函数也是可以的。且互不影响。

最后,若在此文章中发现错误,请尽情指出并见谅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值