static存储类型可以用于全部变量,而无须考虑变量声明的位置。但是,作用于块外部声明的变量和块内部声明的变量时会有不同的效果。
🌵当用在块外部时,static说明变量的名字具有内部链接。
🌵当用在块内部时,static把变量的存储期从自动的变成了静态的。
给大家举例说明一下:
在用于块外部的声明时,🍧static本质上使变量只在声明它的文件内可见。只有出现在同一文件中的函数可以看到此变量。再给大家 举个例子,函数f1和函数f2都可以访问变量i,但是其他文件中的函数不可以:
static的此类用法可以用来实现一种称为信息隐藏的技术。
块内声明的static变量在程序执行期间驻留在同一存储单元内。和每次程序离开所在块就会丢失值的自动变量不同,static变量就会无限期地保留值。static变量具有以下一些有趣的性质。
- 🧃块内的static变量只在程序执行前进行一次初始化,而auto变量则会在每次出现时进行初始化(当然,需要假设它有初始化器)。
- 🧃每次函数被递归调用时,它都会获得一组新的auto变量。但是,如果函数含有static变量,那么此函数的全部调用都可以共享这个static变量。
- 🧃虽然函数不应该返回指向auto变量的指针,但是函数返回指向static变量的指针是没有错误的。
声明函数中的一个变量为static,这样做允许函数在“隐藏”区域内的调用之间保留信息。隐藏区域是程序其他部分无法访问到的地方。然而,更通常的做法是用static来使程序更加有效。思考下列函数:
每次调用digit_to_hex_char函数时,都会把字符0123456789ABCDEF复制给数组hex_chars来对其进行初始化。现在,把数组设为static的:
由于static型变量只进行一次初始化,这样做就提升了digit_to_hex_char函数的速度。