C语言中static的用法

简介: C语言中static的用法

static修饰局部变量

static修饰的局部变量也可以称为静态局部变量

为了引入static,我们先分析一下下面代码的运行结果:

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

代码中有一个test函数,test函数中定义了一个局部变量a;每次调用test函数,都会在内存中给a分配一块空间,a的初始值是5,然后a自加1。test函数调用结束时,a这个变量就会被销毁,下一次调用test函数时再重新给a分配内存空间。而test函数一共调用了10次,因此屏幕上出现10个6

如果再a的前面加上关键字static,结果会怎么样呢?答案还是10个6吗?

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


我们发现此次出现的结果和上面并不一样:a似乎出现了一种累加的效果

下面分析原理:

C/C++代码学习的时候,把内存大概划分为3个区域:栈区,静态区,堆区

而被static修饰的变量就是静态变量,由上图我们已经知道,静态 区创建好的变量会直到程序结束才销毁,所以每次当test函数结束时,变量a并没有被销毁,每次调用test函数时,a的值都是前一次调用结束时的值。


由此可知:static修饰局部变量的时候,本来一个局部变量是存在栈区的,被static修饰就存在静态区了,static修饰局部变量改变了变量的存储类型(位置)最终使得这个静态变量的生命周期变长了,但作用域不变。


static修饰的局部变量和全局变量的区别:static修饰的局部变量只能再局部的作用域内使用。


static修饰全局变量

static修饰的全局变量也可以称为静态全局变量

当我们在一个工程下创建多个文件,如下图

此时程序可以正常运行:

但是,当我们把全局变量g_val用static修饰后,程序就会出现报错:

 之所以出现报错,就是因为加了static的原因。

static修饰全局变量,改变了这个全局变量的链接属性,由外部链接属性变成了内部链接属性,这个静态变量只能在自己所在源文件内部使用,不能再其他源文件内部使用了。(感觉像是作用域变小)

static修饰函数

static修饰的函数也称为静态函数

下面是一个工程中创建了两个文件,add.c文件和test2.c文件

此时编译起来程序正常运行

但是,当我们将Add用static修饰时,程序出现了报错,报错信息和static修饰全局变量那块一样:

static修饰函数和static修饰全局变量是一样的

函数本身具有外部连接属性,但是被static修饰就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能再其他文件内部使用。

总结

static修饰局部变量


       static修饰局部变量改变了变量的生命周期 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。


static修饰全局变量


       一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。


static修饰函数


       一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

目录
相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
229 88
|
5月前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
42 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函数用法
|
5月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
77 2
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
5月前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法