00:02
Static关键字。史sta克关键字呢,在我们C语言里面也也有,就是一个静态斯static翻译克是静态的意思,我们来看一下它是一个怎样的关念,史提个关键字呢,在C语言中比较常用,使用恰当的话呢,能够大大提高程序的模块化的一个特性,有利于扩展和维护好。那首先我们看斯丹提格可以用在什么地方呢?第一个它可以在局部变量使用斯丹提格。也就是说我们有一个局部变量,这个局部变量呢,前面我们可以用static来修饰,那一旦一个局部变量被static修饰了,它就它的这个特性就发生了一些变化,具体来说呢,有这么几点,局部变量被static修饰后,我们从名称上就把它改为叫静态,静态局部变量。这是第一点,对应静态局部变量,在声明时如果说没有复出值,编译器呢,就会把它初始化为零,什么意思?大家还记不记得我们前面讲过局部变量,普通的局部变量,它是不会有默认初始值的。
01:16
对不对,但是呢,注意听,但是如果你是一个静态局部变量,那么它会初始化。就是说编译器会初始化为零,这个呢,我们我们来举个例子。好,我们把这个先注销一下。这边我们也注销了哈,注销过后呢,同学们,我们来写一个小案例,关于static的DEMO。写到这里来。Static。DEMO。嗯,我们来这儿加一个文件。Static。各位在,诶文件上哪儿去了。在这里我们把它后缀改成C。
02:01
协同代码,Include std。当然,这里我写一个主函数。没问题吧,主函数。那现在呢,我这里写一个局部变量,这个局局部变量呢,我就用这规咱们固定好的一个哈,打个比方吧,咱们就就写一个吧,无所谓,比如说in的N等于in的N,那么我在前面加个static。各位。这时这个N啊,这个N就是一个静态局部。变量。那么它是一个静态局部变量呢?它会有一个初始值,注意啊,如果你没有加斯单格是不会有初始值的,还记得吧,局部变量,普通的局部变量不会有初始值,但是如果你是个静态局部变量呢?系统初始化,默认初始化。初始化。初始化值为多少呢?零,我们来试一下print,各位同学看一看。
03:06
我输出来一下,N等于百分号D打出来。Get up。运行。看看代码有没有什么问题哈,以前我们运行呢,会直接。异常中中断,现在呢?会不会呢?大家看不会的,N等于零,说明的确跟老师讲的一样。第三点关于用局部变量修饰,斯坦克修修饰局部变量的特性,静态局部变量它存储在什么地方的呢?它是存储在我们的静态存储区,也就是这个全局性质的这个空间,它只会被初始化一次,即使函数返回,它的值也会保持不变。这里面的重点是要理解我们静态局部变量,它存储的空间是在静态存储区。这点要明白,第二点呢,它只会被初始化一次。
04:04
那有些同学说什么意思啊,简单的讲就是我们的静态局部变量是放在这个空间里面的,它是。放在这个位置的,那这个位置呢,它是属于全局区的,也就是说你调一个函数以后,假设你在一个函数里边定义了一个局静态局部变量,那么这个这个局部变量它是放在哪里呢?放在这个区域的。它不会随着你的函数的销毁而销毁。那这样讲可能大家还是不明白,我举个例子。这个例子呢,我已经给大家准备好了,我们拿过来看一下就行了,好吧,这段代码呢,我们拿过来用一用,很简单的一段代码,我先把这个先注销好不好。好,我拿过来用一下,嗯,这句话呢,嗯,大家看。呃,大家看这是这是一个普通的函数。普通的函数,这是就是我们以前学的函数,这是这个地方呢,大家可以看到这边是一个哦,这个不是跟函数现在还没关系。
05:05
大家看这里。这是一个普通的变量。普通变量,这是一个什么变量呢?这是一个静态局部变量。大家看出来了没有静态局部变量。那么我们来看一下这个这个情况,假如我先把这个先注销一次。先注销,我先把这个注销了啊。我把这个也注销,大家不着急,待会我解释是什么意思,大家有发现我在这里调用了。Fn static这个这个函数。大家看这里面我写的是贸易的,说老师你这个贸易的没有,是不是可以空着写,是的,也可以加一个贸易的,就是有些有些程序员呢,他为了表示我这地方没有,没有行参,他写个贸易的也是可以的,你理解我的意思吧,当然你也可以空着,也是一样的啊,一样的,只是为了明确的说呢,有些程序员喜欢加一个贸易的也是没有错的。
06:05
大家看这里,这是个静态静态局部变量,它第一次输出这个N加加了,那我问大家。他第一次呃,在这调用,这是调用我们的Fn static这个函数,调用了一次以后,这个地方应该输出几啊,显然这个地方应该输出十。为什么是十呢?你这就是十吗?然后N加加,N加加完了过后,这个N就等于多少了11,这时呢,它会。怎么样输出11好,所以说如果我只调用,如果我这里只调用一次FA3提格,它就应该输出一个11个11,看看对不对,运行一下。运起来过后呢,我们可以看到的确跟我们想的一样,十和11。十和11,那现在问题来了,同学们看,假如说。
07:01
我又。调用了一次。我又调用了一次啊,为了好看呢,待会我们这个地方就都换行哈。这这样我都换行一下。输出的时候我们换一行。我问同学们一个问题,如果我这再调用一次,你们会觉得输入什么呢?会做什么呢?同学们,我告诉大家,如果你掉第二次的时候呢,它并不会再重新初始化。而是接着原先的这个11继续变化。而世界的原先这个11继续变化,也就是说这个地方就突出出什么呢?只会被初始化一次,为什么初始化一次呢?相当于说它在创建的时候,他会把我们这一个静态数据放在这个位置。他第一次初始化放在这过后呢,以后的变化就直接在这个位置变化了。呃,大家理解理解这意思吗?就是他只会初始化仪式,比如说嗯,我给大家举个例子,比如说我们以这个为例哈,把这个代码拿过来。
08:07
把这个代码拿过来,我们给大家简单的说明一下。OK,如果你是第一次调用。各位同学认真听。认真听。如果我们第一次调用。这个FN。FN_athetic。第一次调用的时候呢,它会在这个静态区里面放一个这样的值,这个值呢,当然啊,准确一点讲就是N等于多少。它会放在这个空间。理解,那么第呃这个输出,然后N加加,N加加呢,也会找到这个静态数,把它加一个一。当然就输入11了,如果我再调用一次。这个会怎么办呢?各位注意,当它再去调用第二次这个函数的时候,这句话将不再执行,也就是说大家不能理解成会把这个11换成十,不会的。
09:01
也就是说这个初始化只有一次,然后呢,这这个时候再输出,再输出这个呢,就应该还是11N加加呢,还会对它进行一个加变成12。那也就是说,也就是说这个地方第一次输出十,里面还有个11在掉的时候呢,先输出11,再输出12。就这个意思。这是静态。变量的一个特性。这是静态变量的一个特性,那么我们来运行运行一下,看看是不是这样子的啊,你看我这掉了一次,这又掉了第二次,我们来运行一下。跟老师的分析是否一样?第一次输出十,你看跟老师分析的完全一样。十,11 11,因为这个11是上次的,他又加加了再输出12。所以说这个特点大家一定要注意啊,至于这个普通的呃变量我就不去讲了,因为普通变量嗯,它它每次都初始化,普通变量每次执行。
10:01
每次执行啊,都会初始化。为什么他会每次执行都会初始化呢?因为这个N是在战区,为什么因为这个N。这个N在哪里呢?在战区。他用完了过程销毁了对吧,它在占区,它调用1CN产生一个N。用调再调一次,又产生另外一个性能,而这个呢,它是放在哪里呢?这个是放在注意性啊,它是放在我们的这个静态,静态存储。存储区的。存储区,它是一个全局性质的,全局性质的空间。好,就是因为这个原因,好这个呃局部变量修饰十丹提格,呃局部变量使用十丹提格修饰,我们就讲到这儿。那紧接着我们再来讲全局变量使用13提克修饰会有什么特点呢?
11:00
我们也给大家聊两句。普通的全局变量对整个工程是可见的。其他文件可以通过。Term外部声明后直接使用,也就是说,其他文件不能再定义一个与其相同的文件名。否则编译器会认为是重名的,但是静态全局变量,也就是说当一个全局变量被静态修饰过后呢,它仅对当前文件有可见,也就是说如果你是一个全局变量,但是呢,你用静态修饰了,你只能在整当前这个文件使用。你这个当前文件所有函数都可以使用,但是其他文件不可以访问。其他文件可以定义和它相同的变量名,而且不互相影响。那有人说老师这是什么意思呢?来,我跟大家举个例子啊,大家认真听。大家认真听。好,我把这个先注销一下,那现在呢,我写我写两个文件,好,我先写两个文件,这个稍微有点麻烦,注意认真听啊,File f fair101吧,这是第一个文件。
12:05
大家看清楚了,这是第一个文件,看清楚吗?好。当然,我们在写第二个文件,C还是C02。发零二这个文件。然后同样我们把后缀改成C,听,看清楚了啊。那那现在呢,我在第二个文件里面,我定义一个这样的全局变量,看清楚了,比如说我定一个全局变量叫做。Number没问题吧,给他来一个十。我相信同学们明白这是什么意思,这这个就是一个全局变量。这是一个就是我们普通普通的全局变量,看懂了吗?普通权与变量,OK。那么这个普通全局变量呢,我当然在这个本本来这个文件里面去使用,是肯定肯定是可以的,我现在要在这个文件里面使用。Void。
13:00
Me?函数。那同样我还是先把该引入的一个库文件引进来。STDIO没有问题吧?现在我想问大家,我现在能直接使用。我我想去使用FIRE2里面这个number我能使用到吗?大家觉得我能不能使用到number等于百分number我能使用到吗?显然它会报错的。他说你这个怎么样,没有定义过。那这个时候对于一个普通的全局变量,我们想使用的话呢,除了用前面的头文件引入的话呢,还可以这样写也是可以的。怎样写呢?啊,我说一下实用。在注意听在一个文件中使用。另外。另外一个文件的全局变量。啊,当然我是说的是普通的全局变量。使用什么呢?使用exter。
14:03
来引入。引入即可。那我简单写一下啊。Extern。然后呢,Int把这个粘过来。但是你不能再不值了啊,同学们,你像这样引一下就可以了。但是不要再给值了,你不要再给值了,好你看这样就可以用了,那么我们能不能这样用呢?同学们看运行一下就可以。你看啊,我给同学们运行这边会输出一个十。诶,这疑问是哪里错了呢?没有关闭。再来运行一下,我们看看能不能得到number等于十这样一个输出,诶这个地方。闪了一下。各位,我们再次运行。我们再次运行拿到结果是正确。也就是说我们这个普通变量以X就行了,但是我们来理解这句话。但是呢,如果你是一个注意听,你是一个静态的全局变量,那么其他文件就用不了了。
15:05
那什么意思呢?大家看,如果说我在这里加了一个static,我这样写啊,为了不跟他冲突呢,我再写另外一个,比如NUMBER2,为了有时区别呢,改了改成20。好,大家看嗯,如果现在我想用NUMBER2,是不是也很简单,我这样也也可以用NUMBER2啊,我给大家再打一下,因为我要做对比嘛,我不改,我是加一个新的,这样大家看起来会清晰一点。你看这样子,NUMBER2。好,如果说我现在不做任何改动的话呢,NUMBER2我应该也能访问到。因为我引入了两个,呃,引入两个全局变量,那么尔达的,但是我像这样改一下,你们看情况就发生变化了。各位,我在这里加了个static,这个就是一个静态。静态全局变量,那么静态全局变量呢?它的它只能在什么呢?只能啊,只能在本文件本文件中使用,而不能,而不能在在其他文件使用。
16:11
那也也就是说老师,那也就是说我这边exter过后呢,其实也用不了。说老师是不是我给大家用一下,你看啊,现在呢,你看起来好像没有错误,对不对,没有错误,现在同学们看我跟大家运行一下,你看会有什么后果。跑起来。各位错了。那错误的原因呢,诶,我们看一下是不是这样子有提示啊,你看。看到没有,他说无法解析一个外部的符号,就是这个外部符号它找不到了,换言之,说的再具体一点,就是说我不知道这个number是谁。说老师你这不是有吗?但是我用静态修饰了,所以他就不能用了,你看如果我把这个去掉。我把这个去掉,你看我再来运行它就OK了。明白这个意思了吧,也就是说,也就是说大家要明白这一点好,所以说我把这个注销了,明白。
17:06
把这个放到这,这句话就是说,如果你是一个静态的全局变量,只能在本文件使用,而不能在其他文件使用,这一点是同学们需要注意的。而且还有一点。那么其他文件呢,可以定义跟它同名的变量了,两者互不影响,什么意思?就说如果你是一个静态的全局变量,因为你的作用域。或者说你能够可见性呢,只在FIRE0,二里面可以看到,那就意味着我在这里面再去定义一个这样的全局变量,它并不冲突,比如说我int number2等于60。不冲突,那这个时候呢,相当于说我在这访问的number呢,就是我自己这定的number了,那同学们预习一下,这个就是60了,跑起来。大家看是不是没有问题啊。对不对。但是我要说的哈,你这不能定义了,说老师我这有个number number10,我能不能在这再定一个NUMBER10,那是不允许的,你定一个试试看,说老我再定一个number。
18:09
你这有一个,这边有个number,但是我是一个普通的,你说我在另外一个空间再定一个number,你试试看会有什么后果。你看啊,我一运行它会告诉你。重复定义,那这不用说,你看直接报错了。报错了对不对,我就不去看,不不去不去弄,你看这个错误的信息,肯定就应该报的是number这个地方的看。他的number已经定义了吗?是不是啊?他说找到一个或多个重定义的符号不就这事儿了吗?不能这么干啊,同学们。但是你如果是一个static呢,可以,那就是我们这举的这个例子。好,待会把案例拿过来,最后最后,呃,定义不需要与其他文件共享的全局变量时呢?我们可以加static关键字,能够有效的降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。什么意思?就是说假如我有一个A文件,我有一个B文件。
19:10
但是呢,我这个A文件里面,我需要有一个变量能够在这个A文件里面全部都使用到。但是我这个变量呢,只希望在A文件使用,不希望在别的地方使用。那我就可以加一个static。而且这样有个好处,我如果是是个static的一个全局辩论呢,你在这边再去定义跟他同名的不冲突,就这个意思,好同学们,那关于全局变量加斯丹提格的说法,我们就聊到这里,那这样子哈,我们刚才就讲了局部变量使用斯丹提克,又讲了全局变量13体格,那这一讲我们先给大家讲到这儿,大家好好的理解一下,加深一个认识。
我来说两句