【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文件中使用,在别的文件中无法使用。


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

相关文章
|
人工智能 异构计算
用AI实现涂鸦变精美画作
您将学习如何在阿里云交互式建模(PAI-DSW)中,使用Stable Diffusion XL Turbo模型和DiffSynth UI实现AI作画,涂鸦也能生成精美画作。
|
SQL 监控 关系型数据库
ClickHouse快速入门 2
ClickHouse快速入门
555 0
|
9月前
|
人工智能 算法 搜索推荐
2024 “AI+硬件创新大赛”获奖名单出炉,浙大、上交与复旦联队等夺冠
2024年11月30日,由开放源子开源基金会主办,魔搭社区、英特尔与阿里云共同承办的“AI+硬件创新大赛”总决赛在杭州圆满落幕。
237 6
2024 “AI+硬件创新大赛”获奖名单出炉,浙大、上交与复旦联队等夺冠
|
10月前
|
编解码 人工智能 调度
Meissonic:高效高分辨率文生图重大革新
Meissonic的新模型,仅1b参数可实现高质量图像生成,能在普通电脑上运行,未来有望支持无线端文本到图像的生成。
|
12月前
|
算法 机器人 中间件
C++的主要优势是什么?
C++的主要优势是什么?
439 1
|
SQL Java 数据库连接
深入理解 JDBC:Java 数据库连接详解
数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用,几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互,即 JDBC(Java 数据库连接)。本文将深入探讨 JDBC 的各个方面,从基本概念到实际编程示例,以帮助您理解和使用 JDBC。
932 2
注册域名需要多久
注册域名需要多久
307 0
|
数据可视化 Python
Python中的数据可视化:在数据点上添加标签
Python中的数据可视化:在数据点上添加标签
433 3
|
XML 存储 前端开发
【前端】XML和HTML的区别详解
【前端】XML和HTML的区别详解
288 5