【C语言】 Static关键字的用法和详解(太细了!!!)
程序羊羊的笔记本 2024-07-22 10:35:05 阅读 58
文章目录
目录
前言
一、static是什么
二、static的用法
1.修饰局部变量
2.修饰全局变量
3.修饰函数
总结
前言
static在不同的语言中又有不同的使用方法,本文介绍的是static在C语言当中的用法。
一、static是什么
static在C语言中是关键字,中文直译过来是“静态的”,static关键字在C语言中主要是用来修饰变量和函数。
二、static的用法
1.修饰局部变量
——称为静态局部变量
static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。
我们用一段代码来进行详解:
<code>void test()
{
int x = 0;
x++;
printf("%d ", x);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
这段代码中每次调用test()函数时创建局部变量x赋值为0,每次局部变量x出了test()函数后都会自行销毁。
所以可以很容易得到输出结果为:1 1 1 1 1 1 1 1 1 1
接着我们用上static关键字来修饰test()函数中的局部变量x:
void test()
{
static int x = 0;
x++;
printf("%d ", x);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
输出结果变成了:1 2 3 4 5 6 7 8 9 10
原因是static修饰了局部变量x,令局部变量x变成静态的,使得每次test()函数结束时局部变量x都不销毁,再次进入test()函数时则保留原有数值运行,因此x++数值越来越大。
其本质是:
普通的局部变量创建后是放在栈区中,这种局部变量进入作用域时创建,出了作用域就销毁;
但static修饰后的局部变量则放在静态区中,它改变了局部变量的存储位置,从而使得变量的生命周期延长,延长至程序结束才销毁。
注意:static修饰局部变量只改变生命周期,不改变作用域!
2.修饰全局变量
——称为静态全局变量
static修饰全局变量时,会改变全局变量的链接属性,从而使得全局变量的作用域变小。
这段话什么意思呢,先来简单说说全局变量。
全局变量的作用域十分的广,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(以下用extern关键字进行声明)。
接着我们用代码进行解析:
全局变量x在自己的文件内可以直接使用。
但当全局变量在另一个文件内未进行外部声明就想直接用时会出现未定义的错误:
此时只要使用extern关键字声明一下即可:
接着我们进入正题,当我们用static修饰全局变量x后:
会发现生成错误,无法解析外部符号x,全局变量x不能被test.c文件调用了。所以我们可以很容易看出static修饰后让全局变量x的作用域变小了,令全局变量x无法被其他文件调用。
其本质是:
全局变量本身是具有外部链接属性的,在A文件中定义的全局变量,在B文件中可以通过【链接】来使用;
但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用;
3.修饰函数
——称为静态函数
static对函数的修饰与修饰全局变量十分相似,修饰函数时会改变函数的链接属性,从而使得函数的作用域变小。
我们直接上代码:
函数在另一个文件中使用时同样需要声明。
但当函数被static修饰后:
会发现Add函数无法被解析了,static修饰后Add函数的作用域变小了。
本质和全局变量很像:
函数本身也是有外部链接属性的;
被static修饰后,函数的外部链接属性被修改成内部链接属性,使得这个函数只能在自己的源文件内被使用,因此函数的作用域就变小了。
总结
以上就是要说的内容,本文仅仅简单介绍了static在C语言的使用,static在其他语言中还有更多的使用方法。本文是小编的第一篇知识总结,如有不足的地方欢迎大佬们在评论区指出。也还望各位觉得有用的话一键三连+关注,谢谢!
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。