在C语言中,static是用来修饰变量和函数的,1. 修饰局部变量-称为静态局部变量 2. 修饰全局变量-称为静态全局变量 3. 修饰函数-称为静态函数。
1.static修饰局部变量
代码一
程序输出结果全是2,第一次调用test函数的时候,b=1,b++后b等于2,然后输出b=2,当第二次调用test函数的时候,变量b还是等于1,b++后b等于2,然后还是输出b=2,一共输出5次……为啥?因为b是局部变量,b的生命周期出了test函数范围就没了,就被销毁了。
什么是变量的生命周期呢?
变量的生命周期是指变量从创建到销毁的整个过程,它的本质是指变量在程序执行过程中存在的时间段。 简单理解就是局部变量的生命周期很短,出了它的函数范围就死了,而全局变量的生命周期很长,能够在程序中活很久,和main函数一样活的比较长。这里的函数范围就是专业名词作用域,变量的存在范围取决于变量的作用域,可以是全局作用域、局部作用域或其他特定的作用域。
代码二
程序输出结果为2 3 4 5 6,代码二相比代码一的差别就是代码二的局部变量b用了static关键字修饰,用static修饰后的局部变量b的生命周期就会变长,也就是活的比较长了,局部变量b出了test函数范围也不会被销毁,它的作用域也会变大,可以简单理解为局部变量b活的和main函数一样长,main函数不死,b就不灭,直到程序结束,b的生命周期才结束。此时局部变量b也叫做静态局部变量。
2.static修饰全局变量
全局变量可以在你创建的任何文件中使用,但是使用的时候需要关键字extern来声明才能用,比如在add.c文件中创建一个全局变量a,你想在test.c文件中使用全局变量a,需要用extern声明a才能用。如下图
此时程序运行没问题,但是在add.c文件中加上static修饰全局变量a呢?
程序运行错误。可以看到在add.c文件中,用static修饰后的全部变量a不能在外部文件test.c中使用,此时的变量a叫做静态全局变量,static修饰后的全局变量会改变全局变量的作用域,让这个静态全局变量a只能在自己的源文件中使用,出了源文件就不能使用了,简单理解就是static修饰的全局变量它只能在自己的源文件中存活,出了这个范围就不能存活了。
3.static修饰函数
在add.c中创建Add函数,然后在test.c中用extern声明一下,就可以使用,程序运行没问题,输出3。
但是在add.c文件中用static修饰函数后,程序运行错误,错误为无法解析外部符号Add。所以static修饰函数也改变了函数的作用域,更准确的是改变了函数的链接属性。一个函数如果没有被static修饰的时候,该函数具有外部链接属性,外部链接属性的意思就是外部的文件只要想使用该函数,你用extern声明一下就可以拿来使用, 但是一旦被static修饰后,函数的外部链接属性就变成了内部链接属性,该函数就只能在本文件中使用了,外部文件想用该函数也用不了。
4.结论
1.static修饰局部变量,局部变量的生命周期边长。
2.static修饰全局变量,改变了变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,出了源文件就没法再使用了。
3.static修饰函数,也改变了函数的作用域,更准确的说法是改变了函数的链接属性,从函数外部链接属性变为函数内部链接属性。