static和extern对变量和函数的作用

来源:互联网 发布:矩阵理论教材推荐 编辑:程序博客网 时间:2024/05/29 17:19



一.变量的作用域


根据变量的作用域,可以分为局部变量和全局变量

1.局部变量:
(1)定义:在函数(代码块)内部定义的变量(包括函数的形参:函数形参作用域是函数开始到结束)
(2)作用域:从定义变量的那一行开始,一直到代码块结束
(3)生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
(4) 没有固定的初始值
 
2.全局变量
(1)定义:在函数外面定义的变量
(2)作用域:从定义变量的那一行开始,一直到源程序结束(能被后面的所有函数共享)
(3)生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
(4)默认的初始值就是0


二.static和extern对全局变量的作用


1.全局变量分2种:

(1)外部变量:定义的变量能被本文件和其他文件访问

  <1>默认情况下,所有的全局变量都是外部变量

  <2>不同文件中的同名外部变量,都代表着同一个变量

(2)内部变量:定义的变量只能被本文件访问,不能被其他文件访问,不同文件中的同名内部变量,互不影响


2.在C语言中,全局变量定义的位置是有限制的,在默认情况下,一个函数不可以访问在它后面定义的全局变量

解决办法:

  <1>将变量定义在函数的前面

  <2>在函数前面对变量进行声明(全局变量声明在前面加上extern,例如:extern int a 。后面还需要继续定义)


3.重复定义同一个全局变量

全局变量的定义可以无数遍的写(也适合在多文件中),编译器是不会报错,因为写的那么多遍,其实都是同一个变量而已。


4.static关键字

但很多时候,我们并不想让源文件中的全局变量跟其他源文件共享,相当于私有的全局变量,那么你就得用static关

键字来定义变量,这样这个全局变量只能在本文件中访问。


5.static和extern的总结

(1)extern可以用来声明一个全局变量,但是不能用来定义变量

(2)默认情况下,一个全局变量是可以供多个源文件共享的,也就说,多个源文件中同名的全局变量都代表着同一个变量
(3)如果在定义全局变量的时候加上static关键字,此时static的作用在于限制该全局变量的作用域,只能在定义该全

局变量的文件中才能使用,跟其他源文件中的同名变量互不干扰。


三.变量的存储类型


变量存储类型是指变量存储在什么地方,有3个地方可以用于存储变量:普通内存,运行时堆栈,硬件寄存器。变量的

存储类型决定了变量何时创建,何时销毁以及它的值能存储多久,也就决定了变量的生命周期。

C语言中根据变量的存储类型的不同,可以把变量分为:自动变量,静态变量,寄存器变量


1.自动变量

(1)定义:自动变量是存储在堆栈中

(2)自动变量:被关键词auto修饰的局部变量都是自动变量,没人使用这个关键字,因为所以的局部变量在默认情况下

都是自动变量。

(3)生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自己变量所在的代码块(函数)执

行完毕后,这些自动变量就会自行销毁。如果这个函数被重复调用,这些自动变量每次都会重新创建。


2.静态变量

(1)定义:静态变量是存储在静态内存中的,也就不属于堆栈。

(2)那些是静态变量:

  <1>所以的全局变量都是静态变量

  <2>被关键词static修饰的局部变量也是静态变量(作用域还是局部变量的作用域)

(3)声明周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束


3.寄存器变量

(1)定义:存储在硬件寄存器中得变量叫寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,

自动变量和静态变量都是放在内存中的)

(2)哪些变量是寄存器变量:

  <1>被关键词register修饰的自动变量都是寄存器变量

  <2>只有自动变量才可以是寄存器变量,全局变量和静态局部变量不可能是。

  <3>寄存器变量只限于int,char,和指针类型变量使用。

(3)生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。

(4)使用注意:

  <1>由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理

  <2>为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不是用内存


四.static和extern对函数的作用


1.外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数,默认情况下所有函数都是外部

函数。C语言规定,不允许有同名的外部函数。


2.内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规

定不同的源文件可以有同名的内部函数,并且互不干扰


3.extern关键字对函数的作用:用来完整地定义和声明一个外部函数,默认就是extern,完全可以省略。


4.static关键字对函数的作用:用来定义和声明一个内部函数


5.总结:

(1)static

  <1>在定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数),这样该函数就只能

在其定义所在的文件中使用。如果在不同的文件中有同名的内部函数,则互不干扰。

  <2>static也可以用来声明一个内部函数:函数写在后面,先在前面声明一下


(2)extern

  <1>在定义函数时,如果在函数的最左边加上关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言

规定,如果在定义函数时省略extern,则隐含为外部函数。

  <2>在一个文件中要调用其他文件中的外部函数,则需要在当前文件中用extern声明该外部函数,然后就可以使

用,这里的extern也可以省略。


五.总结

1.static对变量的作用:定义一个内部变量


2.extern对变量的作用:声明一个外部变量 


3.static对函数的作用:定义和声明一个内部函数


4.extern对函数的作用:定义和声明一个外部函数(可以省略)


0 0