【C】static关键字详解

简介: static的汉语意思是静态的,在C语言中static关键字可以用来修饰局部变量、全局变量和函数。

概述

static的汉语意思是静态的,在C语言中static关键字可以用来修饰局部变量、全局变量和函数。

在这里给大家补充一个知识,我们的数据在内存中存储时,大概分为3个区域。

1.栈区:我们创建的局部变量、形参等一般就存放在这个区域,离开作用域是会自动销毁,将空间还给操作系统。

2.堆区:堆区存储的数据一般是由我们程序员自己来开辟的,比如使用malloc、realloc等来动态开辟,这个区域的空间需要我们程序员自己释放,否则就会造成内存泄漏。

3.静态区:这里一般存储的是全局变量和静态变量,他是有操作系统创建的,工程结束后由操作系统回收。


static修饰局部变量

在讲这个之前我们先来比较两段代码:

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

运行结果为:

ed0b71e14d67485d80d7c886805902b2.png


再来看下面这段代码:

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

运行结果为:

61399d28f0b9492ca0d4edeb647e5689.png


我们可以看到,这两段代码一个test函数中的i用了static关键字修饰,一个没有,造成运行结果有这么大的差异,这是为什么呢?

其实道理很简单,static来修饰局部变量,该变量就变成了静态变量,那么它就从原本的栈区改变到了静态区,它不会随着函数的结束而被销毁,因此我们就看到了下面的这个结果,我们在这里可以理解为static修饰局部变量延长了局部变量的生命周期。

在这里需要注意的是,static修饰的局部变量,在编译时已经创建了,并不是程序走到这个位置才创建的。


static修饰全局变量

全局变量具有外部链接属性,就是我们在一个工程中可以有多个.c文件,在别的文件中定义的全局变量是可以在我们本文件中使用的,我们在使用的时候只需要用exturn声明一下就可以使用。如:

e21a33e12824401fbc4149d5390beb50.png


我们是可以使用另一个.c文件中的全局变量的,但是如果static修饰了这个全局变量,就使它的外部链接属性变成了内部链接属性,这时我们只能在定义那个全局变量的文件中使用,在别的文件中就不能使用。


static修饰函数

static修饰函数和修饰全局变量非常相似,C语言中函数也是具有外部链接属性的,用static修饰后,也是使它的外部链接属性变成了内部链接属性,这是也只能在定义这个函数的.c文件中使用,在别的文件中无法使用。


今天的分享就到这里了,感谢大家的关注和支持!

相关文章
|
存储 Java
static关键字
static关键字
51 0
|
3月前
|
安全 Java
final关键字
final关键字
|
5月前
|
存储 数据安全/隐私保护 C++
C++一分钟之-C++中的静态成员与静态函数
【6月更文挑战第20天】在C++中,静态成员(变量&函数)打破对象实例化规则,提供类级共享。静态变量独占一份,用于计数或共享配置,需类外初始化,注意访问权限。静态函数不依赖对象,直接通过类名调用,不使用`this`指针,适合工具函数或操作静态变量。示例展示了静态成员的使用,强调了理解和避免常见问题的重要性。
54 4
|
6月前
|
Java
static关键字详解~
static关键字详解~
37 0
|
6月前
|
存储 监控 编译器
【C++】static关键字及其修饰的静态成员变量/函数详解
【C++】static关键字及其修饰的静态成员变量/函数详解
151 3
|
6月前
|
编译器
static关键字修饰成员变量与成员函数
1. static概念 声明 为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量;用static修饰的成员函数,称为静态成员函数,都存放在堆区。 静态成员变量一定要在类外进行初始化。
121 0
|
11月前
|
编译器 C++
类和对象:初始化列表,静态成员,友元,内部类,匿名对象
类和对象:初始化列表,静态成员,友元,内部类,匿名对象
|
存储 Cloud Native Linux
C++ static关键字
C++ static关键字
|
Java C语言 C++
static关键字详解(C/C++)
static关键字详解(C/C++)