【关键字篇】C语言中static关键字的理解与使用

前言

不知道大家在学习static关键字的时候是否对它的用途产生过疑惑。

怎么这个变量怎么就突然使用了static修饰? 究竟是为什么?

本篇小文为大家详细介绍一下这个关键字的用途。

static都可以修饰什么东西?

static修饰的内容有变量函数

简单的画个图来表示一下:

1f1eb10ae1f040549b4a2dec912fab58.png

我们先看一下修饰的写法:

修饰局部变量和全局变量:

​
#include <stdio.h>
static int num1 = 0; //修饰局部变量
int main()
{
	static int num2 = 0;  //修饰全局变量
	return 0;
}

​

修饰函数:

​
static int Fun()
{
	return 0;
}

​

static修饰局部变量有什么作用?

修饰局部变量

对于一个局部变量而言,出了其所在的作用域,它就会自动销毁,也就是说仅仅在它所在的范围内有效。

​
#include <stdio.h>
int Fun()
{
	int i = 0;
	i++;
	return i;
}
int main()
{
	printf("%d\n", Fun());
	printf("%d\n", Fun());
	printf("%d\n", Fun());
	return 0;
}

​

此时printf函数可以正常输出局部变量i的值。

输出结果:
1
1
1

对于以上代码的解释是这样的,每进入一次Fun()函数,i的值都会重新创建,Fun()函数执行结束后i的值就会被销毁,所以每次进入Fun()函数,i的值都会被置成0,随后加1跳出。

那被修饰之后呢???

现在我们用static修饰一下i变量

​
#include <stdio.h>
int Fun()
{
	static int i = 0;
	i++;
	return i;
}
int main()
{
	printf("%d\n", Fun());
	printf("%d\n", Fun());
	printf("%d\n", Fun());
	return 0;
}

​
输出结果
1
2
3

当变量i被static修饰之后,跳出Fun函数后,变量i的值不会销毁,因此每一次执行都会保留i的值。

修饰局部变量后这个变量在底层做出了什么改变?

显而易见的是,局部变量的生命周期变得更长了,这是怎么实现的呢?

其实 在学习C/C++代码的时候,我们通常会把内存的区域划分成三个。

9d1b9b0bf31c4ca6bbae0498104ace92.png

当局部变量被修饰之后,在编译时,就会把这个局部变量规划到静态区,成为静态变量,成为看似全局变量的存在。

被static修饰的局部变量和全局变量有什么区别?

到这里有的小伙伴可能会疑惑,这个被static修饰的局部变量,怎么和全局变量那么像,它们有什么区别呢?

其实,虽然生命周期变长了,但是它的作用域依然是原局部变量的作用域!本质上还是一个局部变量!

何以见得?

还是原来的代码我们进行举例:

​
#include <stdio.h>
int Fun()
{
	static int i = 0;
	i++;
	return i;
}
int main()
{

	Fun();
	printf("%d\n", i); //这里printf无法找到i的值,因为从脱离了i的作用域,i的值依然保留但是不可以使用。
	return 0;
}

​

这里printf无法找到i的值,因为从脱离了i的作用域,i的值依然保留但是不可以使用

static修饰全局变量有什么作用?

在探讨static修饰全局变量有什么作用之前,我想说一下外部连接属性这个概念。

变量的外部连接属性简单来讲就是在一个源文件中定义的变量,可以在其它源文件中使用。

在一个工程中,我们可能会创建多个源文件,如果一个变量具有外部链接属性,那么即便是只在其中一个源文件定义过一次,仍然可以被其他源文件使用,使用时仅需要声明一下即可(在变量前加 extern)。

全局变量就是有外部链接属性的变量。

当全局变量被static修饰时,改变了全局变量的连接属性,它便失去了外部链接属性,仅仅可以在它自己所在的源文件中使用(内部连接属性)。

static修饰函数有什么作用?

static修饰函数其实和修饰全局变量很类似

在一个源文件中创建的函数也可以用在不同的源文件中,和全局变量类似,在其它源文件中使用需要进行声明 。

例如:

extern int Add(int x,int y);

用static修饰后,这个函数就不能在除自己所在源文件以外的源文件中使用。

函数本身具有外部链接属性,但是被static修饰就只有内部链接属性,只能在自己所在的源文件内部使用。

结语

以上就是static关键字在C语言当中的作用啦,可以看出,static关键字更多的是赋予被修饰事物"静态"的属性,修饰局部变量可以改变它的生命周期,使它出了作用域仍然不会被销毁。修饰全局变量和函数,可以改变它们的链接属性,使他们仅仅能在自己所在的源文件中使用。

全局变量和静态变量,在编译时就会被创建,而局部变量是在程序运行的过程中才被创建的,掌握了这些有助于我们更好的理解它们的生命周期。

如果还想了解更多计算机知识,欢迎大家关注我,在以后的日子里,我会经常更新哈

 

 

 

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值