今天带大家了解的是static关键字,由于作者水平有限,如有错误,敬请谅解斧正!
在了解static之前,我们先了解一下c语言中为何要出现static这个关键字呢?学过c++的相信都知道,c++有个特性叫做封装,这个是为了程序的安全考虑的,使程序对外暴漏出的接口变少,达到安全的目的,static这个关键字亦然,也是为了程序的安全考虑,所以才会使用这个关键字,我们在写c程序的过程中,要学会将某些变量定义为static静态变量,使程序变得更加安全可靠。
然后需要给大家补充一个知识,这是一个并不被大家注意到的点,就是全局变量和全局函数能否跨文件被直接访问呢?大家首先想到的应该是不可以,为什么呢?因为我们通常所了解到的就是引入另一个函数中的函数或者变量需要用extern,但事实就是全局变量和全局函数在不进行extern声明和文件包含的情况下是可以直接使用的,就是说我们这样操作程序是可以直接运行的,当然,编译器会警告,但结果并不会出错,很意外吧,大家需要先记住这个结论,即全局变量和全局函数是可以直接跨文件访问的,当然我们写代码的时候,需要跨文件时,最好在变量前加上extern来提高代码的可读性,在以后写大型程序时方便自己的同时也方便他人,提高代码的可维护性。
好了,言归正传,接下来带大家了解一下static关键字的用法及作用。
用法格式:static 数据类型 变量名 =初值;
作用:
1、修饰全局变量,该全局变量只能在本文件内被使用,即一个源文件中定义了一个静态全局变量,在另一个源文件中将无法再使用,如果使用,编译器会报错。
2. 修饰局部变量,局部变量的作用域不改变,但生命周期发生改变,修饰后的生命周期等同于全局变量的生命周期。这个地方有一个经典的案例来帮助大家理解:
#include<stdio.h>
#include<Windows.h>
void fun1()
{
int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
for (int k= 0; k < 10; k++)
{
fun1();
}
system("pause");
return 0;
}
运行之后呢,会输出10个1,如何理解呢?简单来说吧,每一次fun1函数的调用,都会执行int i =0;这个语句开辟内存到栈区,栈区存放是局部变量,在函数调用结束后,栈区的内存就自动释放掉了,即变量i就消失了,所以可以这么理解每一次fun1函数调用时的变量i都是一个新的变量i,都会对新的变量i进行开辟内存及赋值操作i=0,所以每一次输出的结果都是1。接下来看下面这段代码:
#include<stdio.h>
#include<Windows.h>
void fun2()
{
static int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
for (int k= 0; k < 10; k++)
{
fun2();
}
system("pause");
return 0;
}
运行之后输出结果是1到10,很明显发现上述两段代码的不同,在这段代码中将fun2()中的变量i定义为了静态变量。static将变量i存放到了静态数据区域,变量i仍是局部变量,但生命周期已经发生改变,此时变量i的生命周期已经等同于全局变量的生命周期,即在每一次函数调用结束后,变量i所在的内存空间并未被释放,而是仍存储在内存中的静态数据存储空间中,再次调用时也不会被重新赋值,所以值随着函数的每一次调用而发生改变,并且会继承上一次调用后变量i的值,只有在整个程序运行结束后,变量i所在的内存空间才会被释放。同时,存放的内存空间位置不同正是它们生命周期不同的根本原因。接下来给大家展示一个c程序地址空间的图,来方便大家的理解。
3、修饰函数,该函数只能在本文件内使用。
事实上,大家看1和3的作用就可以看出,static对全局变量和全局函数使用后可以防止编译器对全局变量和全局函数默认的跨文件访问,有一个类似封装的特性,这种特性能够在某种程度上保证代码的安全性。
由于某些代码剪接起来较为麻烦,所以1和3就不给大家做展示了,大家可以自己敲一下代码进行感受检验一下,纸上得来终觉浅,绝知此事要躬行。
好了,今天的分享到此结束,如果大家觉得这篇文章对大家能够有所帮助的话,希望大家一个小小的赞可以吗?
|