C语言static关键字

在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。

1、定义局部静态变量

普通局部变量存储于进程栈空间,使用完毕会立即释放。

静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

特点

  • 变量在全局数据区分配内存空间;它始终驻留在全局数据区,直到程序运行结束。
  • 即使在声明时未赋初值,编译器也会把它初始化为0。
  • 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束

例子:

#include <stdio.h>
#include <stdlib.h>

void test1()
{
	int m = 0;
    m = m + 1;
    printf("%d",m);
}

void test2()
{
	static int n = 0;
    n = n + 1;
    printf("%d",n);
}

int main()
{
	int i = 0;
    int j = 0;
	while(i<6)
    {
		test1();
        i++;
    }
    printf("\n");
    while(j<6)
    {
		test2();
        j++;
    }
    printf("\n");
	system("pause");
	return 0;
}

运行结果:

 2、定义全局静态变量

普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

特点:

  • 全局区分配内存,如果没有初始化,其默认值为0.
  • 该变量在本文件内从定义开始到文件结束可见。

例子:

int x=100;//全局变量
#include <stdio.h>
extern x;//extern 用来声明外部命令
int main()
{
	printf("%d\n", x);
	return 0;
}

结果:

 static修饰全局变量

static int x = 100;
#include <stdio.h>
#include <stdlib.h>
extern x;
int main()
{
    printf("%d\n",x);
    return 0;
}

结果:

 错误信息为:第一条警告  全局变量 ‘x’ 定义但未被使用  ,第二条错误为 未定义对 ‘x’ 的引用

一个全局变量具有外部链接属性的 (就是可以被其他源文件引用)但是被static 修饰后外部链接属性就变成了内部链接属性 只能在自己所在的源文件内部使用不能在其他文件内部使用。

3、定义静态函数

函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

  • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
  • 不同的文件可以使用相同名字的静态函数,互不影响
  • 非静态函数可以在另一个文件中直接引用

例子:

//a.c
void fun()
{
    printf("hello \n");
}
//main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
    fun();
    return 0;
}

结果:

 加static修饰 fun()函数

//a.c
static void fun()
{
    printf("hello \n");
}
//main.c
#include <stdio.h>
#include <stdlib.h>
extern fun();
int main()
{
    fun();
    return 0;
}

结果:

总结: 

static有什么用途?

1、限制变量的作用域(static全局变量)

2、设置变量的存储域(static局部变量)

  • 函数体只会被初始化一次,一个被声明为静态的变量在这一函数被调用过程中维持其值不变
  • 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。(只能被当前文件使用
  • 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。(只能被当前文件使用

 

在C语言中,为什么static变量只初始化一次?

对于所有的对象〈不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆"功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。存放在静态区的变量的生命周期一般比较长,它与整个程序"同生死.共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于它存放在栈区,一旦函数调用结束,就会立刻被销毁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

◣星河◢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值