带你熟知关键字static用法——C语言(举例及通俗易懂)

简介: 带你熟知关键字static用法——C语言(举例及通俗易懂)

引入

 首先我们看两个例子:

例1

#include<stdio.h>
void test()
{
    int i = 0;
  i++;
  printf("%d", i);
}
int main()
{
  int a = 0;
  while (a < 10)
  {
    test();
    a++;
  }
  return 0;
}


例2

#include<stdio.h>
void test()
{
  static int i = 0;
  i++;
  printf("%d", i);
}
int main()
{
  int a = 0;
  while (a < 10)
  {
    test();
    a++;
  }
  return 0;
}



那么请问例1和例2的输出结果一样吗?答案是肯定不一样的。我们来看一下例1和例2分别输出的结果。

  为什么两个的输出结果不一样的,原因就是在static修饰了局部变量。接下来我们仔细分析一下原因。


一、static的简单认识


  1. 在c语言中,static是一个常见的关键字 可用来修饰。
  2. static可修饰局部变量、全局变量、自定义函数。



二、static的具体用法

1、static修饰局部变量


从刚开始我们引入的两个例子可以发现,例2中static修饰了局部变量。而修饰局部变量有什么意义呢?首先我们先来了解一下局部变量、静态变量等在内存中所储存的位置。

                                     



 我们都知道,局部变量进去作用域时创建,出了作用域就自动释放了。这也是例1打印出来10的一的原因。但是当static修饰局部变量时,例2中的局部变量a就变成了静态变量,放在了静态区。放在静态区的数据创建后直到整个程序结束才释放。例2中当第一次调用完test函数后,第二次调用时,a此时的值为1,同时不会执行static int =0语句,而是直接执行a++语句。


总结:


static修饰局部变量,局部变量变成静态变量,从而放在静态区。静态区的变量从创建后直到整个程序结束之后才释放。

通俗来讲,static修饰局部变量是改变了局部变量的生命周期,使其生命周期变长。

本质来讲,static修饰局部变量是改变了局部变量的储存位置。

注意static修饰局部变量,是改变了局部变量的生命周期,而不是作用域。


2、static修饰全局变量


全局变量本身就具有的属性是外部链接属性。在不同的源文件中,要引用其他源文件的全局变量,只需要用extern关键字就行。但是当我们用static修饰全局变量后,在另一个源文件中引用时就会发现找不到外部符号,也就是不能再引用。如下图:

6a574c7b2a4d40a59606b83f38b4bda1.png


总结:

  1. static修饰全局变量,使全局变量不在有外部连接属性。
  2. 通俗来讲,static修饰全局变量后,使全局变量只能在自己所在的源文件中使用,不能被其他源文件通过extern链接使用。
  3. static修饰全局变量使其作用域变小。


3、static修饰函数


函数本身也是具有外部链接属性的。 在不同的源文件中,可以通过extern来引用其他源文件的函数。但是当static修饰函数时,其他源文件就不能过再引用。也就是使函数的外部链接属性变成了內部链接属性。

6314f1afabe54e2a90bffffd5234fdf3.png


总结:

  1. static修饰函数,使函数不在有外部连接属性。
  2. 通俗来讲,static修饰函数后,使函数只能在自己所在的源文件中使用,不能被其他源文件通过extern链接使用。


结尾

综上我们可以看出,static的作用还是挺大的。static修饰局部变量、全局变量、自定义函数时意义分别也是不同的。但是修饰全局变量、自定义函数时较为相似。

 希望以上内容对你有所帮助,感谢阅读。

相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
229 88
|
5月前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
43 1
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
53 10
|
3月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
162 2
|
3月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
75 1
|
3月前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
5月前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
4月前
|
C语言
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
5月前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称