C语言本身内置了关键字,并非自己创建,也不能自己创建。
static的功能:
修饰局部变量 | 转变储存位置,延长局部变量生命周期,也可以保持其值不变 |
修饰全局变量 |
将外部链接属性变为内部连接属性,使作用域变小,其他源文件(.c)就不能再使用这个全局变量了,增加程序安全性 模块内函数外,将其变成本地全局变量 |
修饰函数 |
将外部链接属性变为内部连接属性,使作用域变小 将此函数变为模块的静态函数,模块内其他函数无法调用 |
栈区 | 局部变量... |
堆区 | 动态内存管理 |
静态区 | 静态变量、全局变量... |
局部变量进入作用域创建,出作用域销毁,static修饰局部变量时,局部变量出作用域也不销毁,本质上static修饰局部变量时,改变了变量的存储位置,程序结束时,静态变量才销毁。
存储位置的改变,影响的是变量的生命周期。
#include <stdio.h> int add() { static int a = 1;//改变变量a的存储区域 a++; printf("%d\n", a); return 0; } int main() { int i = 0; while (i < 5) { add(); i++; } add(); return 0; }
先看不用static修饰:
用static修饰变量a:
进入反汇编界面:
可以发现,该静态变量没有对应汇编语句。
那么试试将变量a直接定义为全局变量:
反汇编:
同样没有对应汇编语句。
前面已经说过static修饰局部变量时会改变局部变量的存储位置到静态区,全局变量也存储在这个位置,
那么static修饰局部变量是不是就相当于定义全局变量呢? 这个问题还不能下定论,留在此处,标记日后处理。
补充一个关键字extern,调用模块内其他文件定义的全局变量时需声明 ,
编译器工作时是扫描本页面代码,如果不声明此变量,编译器就会报错未定义此变量,所以跨文件调用需声明。
注意:跨文件调用函数不声明不会报错,有时会警告,所以最好声明
标签:变量,作用域,局部变量,关键字,static,修饰,第四篇,全局变量 From: https://www.cnblogs.com/xiaowanglong/p/17873260.html