C语言入门——class9

目录

1.static关键字

1.1 作用域

1.2 生命周期

1.3 static修饰局部变量

1.3.1 作用

1.3.2 本质

2. extern 关键字

2.1 extern 

2.2 static 修饰全局变量

2.3 static 修饰函数

1.static关键字

1.1 作用域

作用域(Scope)是指在程序中某个特定部分定义的变量所能被访问的范围。

我们写个代码直观地感受这个情况

C语言入门——class9_第1张图片

这个代码,我们第一眼看可能觉得没什么问题,打印两次0嘛,但是我们执行一下,看看效果:

C语言入门——class9_第2张图片

不对呀,我们刚开始明明创建了变量,a=0,但是为什么说我没定义呢。

仔细看代码,我们不难发现,int a=0是在一个括号里,而我们第二个打印在括号以外,造成这种情况的原因就是我们在代码块(代码块是由一对花括号{}括起来的一组语句)里面定义的局部变量,只能在它所在的代码块里面有效,出了代码块就无效了,因此才会报错。

C语言入门——class9_第3张图片

所以我们可以得出结论:我们定义的一些变量、常量等,并不是在整个程序中都是有用的,而是有相应的作用范围,在这·者常量是有效的,出了这个范围,就是无效的,这个范围就是对应变量或者常量的作用域。简单来说就是起作用的区域。

而回想我们之前学习的全局变量和局部变量,我们可以得出结论

局部变量的作用是局部变量所在的范围

全局变量的作用域是整个项目

1.2 生命周期

变量的生命周期是指该变量在程序执行过程中存在的时间段。其实就是指的是变量有效的时间段,我们在结合作用域,可以得出如下的结论:

局部变量,在作用域中被创建的时候,生命周期开始,出了作用域生命周期结束.

全局变量,在创建时生命周期开始,整个程序就是他的生命周期

C语言入门——class9_第4张图片

请看下面的例子:

C语言入门——class9_第5张图片

这段代码的结果是什么呢?

我们首先需要明确main函数里的i与test函数中的i不是一个概念。

我们可以通过取地址操作来观察一下。

这个是test函数中i的地址

这是main 函数中i的地址

然后我们就可以发现,每次进入test 函数,i 就被赋值为0;进入i++以后,i变成1打印出来,然后i的生命周期就结束了,等到进行一次循环以后,i又被创建,以此类推。

所以打印的结果应该是5个1,运行:

C语言入门——class9_第6张图片

那如果我们每次出函数不想销毁,重复使用,我们该怎么做呢,这个时候可以用static关键字

1.3 static修饰局部变量

1.3.1 作用

它的作用是,当修饰局部变量以后吗,局部变量的生命周期会延长,重新使用的时候也不会被重新创建,而是使用原来的。

于是我们将代码改成下面的样子

C语言入门——class9_第7张图片

这个时候,我们分析代码,test函数中的i被创建以后,一直存在,每次都会加1,最后打印的是1,2,3,4,5

运行代码验证一下:

C语言入门——class9_第8张图片

没有问题。

1.3.2 本质

那为什么会出现这种效果呢,本质是怎么实现的呢?原来是因为改变了变量的存储位置,对于局部变量,存储位置是内存中的栈区。

C语言入门——class9_第9张图片

而如果加上了static储存位置就变成了静态区,储存在静态区以后,生命周期就跟全局变量一样了,只有程序结束,变量才会被销毁。但是作用域并没有发生任何变化。

C语言入门——class9_第10张图片

2. extern 关键字

2.1 extern 

在学习static 修饰全局变量与函数之前,我们先学习一下extern 关键字。

我们在一个项目中创建两个源文件

然后我们在一个源文件中,定义一个全局变量,在另一个源文件中使用它,会发生什么事情呢?

C语言入门——class9_第11张图片

我们会发现,用不了。

那如果我们想要使用,怎么办呢,我们可以在引用的那个文件里面声明一下,用关键字extern。

请看这样

C语言入门——class9_第12张图片

这个时候我们再执行一下,没有问题。

C语言入门——class9_第13张图片

extern 就类似于导入。

对函数是不是也具有这种效果呢,我们以加法函数为例,

C语言入门——class9_第14张图片

我们可以发现同样出现了警告:

C语言入门——class9_第15张图片

这个时候,我们使用extern

C语言入门——class9_第16张图片

这个时候我们发现已经没有问题了
因此,我们可以知道extern 的作用就是声明外部符号的,如果一个全局的变量或函数在A文件定义,但是如果还想在C文件使用,我们可以使用extern 对其进行声明。

2.2 static 修饰全局变量

那如果这个时候我们,我们在全局变量前加上static会有什么效果呢,我们试一下:

C语言入门——class9_第17张图片

C语言入门——class9_第18张图片

报错:

一个全局变量被static修饰,就会导致这个变量只能在他所在的源文件使用,即使我们在其他文件中调用,也是无效的。造成这种情况的原因是:全局变量本质是具有外部链接属性的,我们可以简单的理解为,外部文件是可以调用的,但是如果被static修饰了,会失去了外部链接的属性,不能被其他文件使用。

2.3 static 修饰函数

请看下面的代码

C语言入门——class9_第19张图片

C语言入门——class9_第20张图片

报错

这种情况产生的原因与修饰全局变量一致,函数本质是具有外部链接属性的,我们可以简单的理解为,外部文件是可以调用的,但是如果被static修饰了,会失去了外部链接的属性,不能被其他文件使用。

你可能感兴趣的:(开发语言,c语言)