【C语言】static关键字详解(超详细!!入门必看!!)

本文详细解释了C语言中static和extern的关键字,讨论了它们如何影响变量的作用域和生命周期,以及static修饰局部变量、全局变量和函数时的不同效果。特别强调了静态变量在存储类型和链接属性上的变化。
摘要由CSDN通过智能技术生成

目录

static关键字与extern关键字

作用域与生命周期

作用域(scope):

生命周期 :

static修饰局部变量:

static修饰全局变量:

 static修饰函数:


static关键字与extern关键字

static和extern都是C语言中的关键字。

static是静态的意思,它的作用有:

1.修饰局部变量。

2.修饰全局变量。

3.修饰函数。

extern:用来声明外部符号。

作用域与生命周期

在讲解static和extern之前讲解一下:作用域生命周期

作用域(scope):

通常来说,一段程序代码中所用到的变量名并不总是有效(可用)的,作用域就是这个变量名有效的代码范围。

1.局部变量的作用域是变量所在的局部范围(所在函数的范围)。

2.全局变量的作用则是整个项目。


#include<stdio.h>
int main()
{
	int a=0;//我们在main函数里定义一个变量a,那么a的作用域就是它所在main函数的范围。
	return 0;
}

🔺:我们在main函数里定义一个变量a,那么变量a就是一个局部变量,局部变量a的作用域是它所在main函数的范围。


#include<stdio.h>
int b = 0;//我们在函数外定义了一个变量b,那么变量b就是一个全局变量,全局变量b的作用域是整个项目。

int main()
{
	int a=0;//我们在main函数里定义一个变量a,那么a的作用域就是它所在main函数的范围。
	return 0;
}

    🔺:我们在函数外定义了一个变量b,那么变量b就是一个全局变量,全局变量b的作用域是整个项目。

生命周期 :

生命周期指的是变量的创建(申请内存)到变量的销毁(回收内存)之间的一个时间段。

1.局部变量的生命周期是:进入作用域变量创建时生命周期开始,出作用域变量销毁时生命周期结束。

2.全局变量的生命周期是:整个程序的生命周期。


#include<stdio.h>
int b = 0;//我们在函数外定义了一个变量b,那么变量b就是一个全局变量,全局变量b的作用域是整个项目。
int main()
{
	int a=0;//变量a的生命周期由此处开始:变量a被创建(申请内存)。
	return 0;
}           //变量a的生命周期从此处结束:main()函数结束,变量a被系统销毁(回收内存)。

🔺:局部变量a的生命周期从它被创建(申请内存)开始,到它所在的main函数结束(回收内存)为止。

🔺:全局变量b的生命周期与整个程序的生命周期一样长,即它的生命周期从整个程序开始运行时开始,整个程序结束运行时结束。

static修饰局部变量:

static修饰局部变量:本质上影响了变量的存储类型,一个局部变量是存储在栈区的,但是被static修饰后就存储在静态区了,因为存储类型的变化,生命周期就跟着变化了。

但是其作用域不变,仍为所在函数的范围。

下面用一段代码作为例子方便大家进行理解:

#include<stdio.h>

void test()
{
    int k = 1;
	k++;
	printf("%d ", k);
}
int main()
{	
	int i = 0;
	for(i=0;i<5;i++)
	{
		test();
	}
	return 0;
}

代码运行结果如下:

        为什么运行结果是2 2 2 2 2呢,因为变量k是局部变量,它的作用域在test所在的范围内,我们在main函数里调用test函数时每调用一次,k就会被创建一次,同样的在test函数结束时,k变量随即被销毁,下次进入循环时k又被创建,所以每次输出的k值都为2。

下面我们用static关键字修饰局部变量k:

#include<stdio.h>

void test()
{
	static int k = 1;\\使用static修饰局部变量k
	k++;
	printf("%d ", k);
}
int main()
{	
	int i = 0;
	for(i=0;i<5;i++)
	{
		test();
	}
	return 0;
}

代码运行结果如下:

        结果为2 3 4 5 6,因为我们使用static修饰局部变量k改变了它的生命周期,此时变量k存储在静态区而非栈区,它的生命周期和程序一样长,因此在test函数结束时,局部变量k不会被系统销毁,所以经过五次循环它的值依次增加,最终结果为2 3 4 5 6。

static修饰全局变量:

首先我们要知道全局变量是具有 外部链接属性 的

全局变量被static修饰后,它的外部链接属性就变成内部链接属性,即这个全局变量只能在自己的.c文件内被使用,其他文件看不到也无法使用,相当于作用域缩小了。

下面用一个例子来帮助大家理解:

🔺:我们在test.c文件中定义一个全局变量val,在practice.c文件中使用extern进行外部声明后打印出val的值,程序成功运行并打印出val的值0,这便是全局变量的外部链接属性,即可以被其他文件使用(需要进行extern外部声明后使用)。

接下来我们使用static关键字修饰全局变量val:

🔺:当我们使用static修饰后,运行程序会发现程序报错,error:无法解析的外部符号val,这就是上面提到的,使用static修饰全局变量会将其外部链接属性变为内部链接属性,全局变量val的作用域被缩小了。

 static修饰函数:

函数与全局变量一样具有外部链接属性

与全局变量一样,函数被static修饰后,外部链接属性就变成了内部链接属性,其作用域被缩小,这个函数只能在自己所在的.c文件中使用,在其他文件中即使声明了也无法使用。

 由于static修饰函数与修饰局部变量一样,因此不再举例。

  • 46
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值