C语言 static extern 修饰 局部变量&全局变量&函数

692 阅读5分钟

局部变量与全局变量简介

局部变量

 概念: 局部变量就是定义在函数, 代码块和函数形参列表中的变量, 我们就称之为局部变量

 作用范围: 从定义的那一行开始一直直到遇到大括号结束或者遇到return为止

 特点: 

    相同作用域范围内不能出现同名的局部变量

    不同作用域范围内出现同名的局部变量, 内部的局部变量会覆盖外部的局部变量

注意:

    局部变量没有固定的初始化值, 如果没有对局部变量进行初始化, 那么局部变量中是一些随机的值, 所以在开发中千万不要使用未初始化的局部变量

 存储位置:

    局部变量存储在栈中, 当作用域结束系统会自动释放栈中的局部变量

 全局变量

 概念: 写在函数,代码块,形参列表外的变量, 我们就称之为全局变量

 作用范围: 从定义的那一行开始一直直到文件末尾(暂时这样认为)

 特点:

    全局变量和局部变量可以同名

    如果存在和全局变量同名的局部变量, 那么局部变量会覆盖全局变量

注意:

    全局变量如果没有进行初始化, 那么系统默认会将全局变量初始化为0

 存储位置:

    全局变量存储在静态区中, 他会随着程序的启动而创建, 随着程序的结束而结束

外部全局变量与内部全局变量

全局变量分为两种:

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

    什么是外部全局变量? 可以被其它文件访问的全局变量我们称之为外部全局变量

 2.内部全局变量, 只要给全局变量加上static关键字就是内部全局变量

    什么是内部全局变量? 只能被当前文件访问的全局变量我们称之为内部全局变量

 

 外部全局变量有一个特点:

    可以定义同名的外部全局变量

    多个同名的外部全局变量指向同一块存储空间

 

 内部全局变量有一个特点:

    也可以定义多个同名的内部全局变量

    多个同名的全局变量如果不在同一个文件中, 那么指向不同的存储空间

注意:

为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量, C语言提供了另外一个用于修改全局变量的关键字, static

 只要用static修改的全局变量就是内部全局变量, 只能在当前文件中使用

 这样就可以提高我们全局变量的安全性

 

 如果多个文件中存在同名的内部全局变量, 相互不会影响

 如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量

static&extern修饰全局变量&局部变量

针对全局变量:

extern:

默认全局变量就是外部全局变量

    用于声明一个外部全局变量

    声明只需要在使用变量之前声明就可以了

 static:

    用于定义一个内部全局变量

 声明和定义的区别:

    声明不会开辟存储空间

    定义会开辟存储空间

针对局部变量:

static:

当使用static来修饰局部变量, 那么会延长局部变量的生命周期, 并且会更改局部变量存储的位置 , 将局部变量从栈转移到静态区中,但是它并没有改变变量的作用域

只要使用static修改局部变量之后, 当执行到定义局部变量的代码就会分配存储空间, 但是只有程序结束才会释放该存储空间

应用场景:

     当某个方法的调用频率非常高, 而该方法中更有些变量的值是固定不变的

     那么这个时候就可以使用static来修饰该变量, 让该变量只开辟一次存储空间

     这样可以提高程序的效率和性能

extern:

不是定义局部变量,它用在函数内部是声明一个全局变量

内部函数与外部函数定义

默认情况下所有的函数都是外部函数

 什么是外部函数? 可以被其它文件访问的函数称之为外部函数

 什么是内部函数? 只能在当前文件中范文的函数称之为内部函数

static&extern修饰内部函数&外部函数

extern

只要在函数的返回值前面加上一个extern就可以让函数变为一个外部函数, 由于默认就是外部函数, 所以在开发中一般情况extern没人写

如果extern写在函数的实现中, 代表定义一个外部函数

如果extern写在函数的声明中, 代表声明一个外部函数

static

只要在函数的返回值前面加上static就可以让函数变为内部函数, 其它文件就不能访问了

如果static写在函数的实现中, 代表定义一个内部函数

如果static写在函数的声明中, 代表声明一个内部函数