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修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

目录
相关文章
|
8天前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
13 1
|
6天前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
26天前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
19 2
|
26天前
|
存储 C语言
C语言学习记录——复习数据存储类别(auto、register、static、extern)
C语言学习记录——复习数据存储类别(auto、register、static、extern)
17 1
|
12天前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法
|
12天前
|
C语言
C语言strcpy函数用法
C语言strcpy函数用法
|
2月前
|
编译器 C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(上)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
18 1
|
2月前
|
存储 Web App开发 编译器
C语言程序设计——int,double,char的用法
C语言程序设计——int,double,char的用法
|
2月前
|
C语言
C语言程序设计——if与else if的区别及用法
C语言程序设计——if与else if的区别及用法
|
2月前
|
存储 编译器 C语言
c语言中static关键字的作用
c语言中static关键字的作用