紧接上一篇博客,在上一篇博客中我简单的解释了那些关键字的意思
下面我们插播一些小知识
插播一:
内存的大概划分
插播二:
在VScode中 ,每个.c文件的运行都是单独的经过编译器处理的
关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
auto(使局部变量自动创建与自动销毁)
代码:
#include <stdio.h> int main() { auto int a = 0; int b = 0; return 0; }
其实在定义局部变量的时候我们只是省略了auto
关键字 typedef
代码:
#include <stdio.h> typedef unsigned int uint; typedef int INT; int main() { unsigned int a = 0; uint b = 2; INT c = 3; printf("a=%d b=%d c=%d", a, b, c); return 0; }
结果:
可以看出typedef(类型重定义),太长的数据类型我们就需要简化
uint INT都是别名
关键字static(静态的)
有三种用法 修饰局部变量 修饰全局变量 修饰函数
下面我
来简单介绍
static 修饰局部变量
代码:
#include <stdio.h> //没有static修饰 int Add_1() { int i = 0; i += 2; return i; } //有static修饰 int Add_2() { static int i = 0; i += 2; return i; } int main() { int a = 0; int b = 0; while (a < 5) { int c = 0; c = Add_1(); printf("c=%d\n", c); a++; } while (b < 5) { int d = 0; d = Add_2(); printf("d=%d\n", d); b++; } return 0; }
结果:
static int i = 0的创建是进入函数就创建好了,不是运行它才创建,往后再调用就会继续使用之前的i.不会创建新的i
我们可以查看反汇编
两者不同
查看反汇编的方法
调试到如图中的为位置
然后右击鼠标
static修饰局部变量总结:
局部变量在没有static修饰会在出函数范围就自动销毁,有static修饰的局部变量,在第一次运行函数就创建了,出函数也不会销毁,就无需再次创建,可以理解为生命周期延长了,但是作用域不变
本质:在没有static修饰的局部变量就会存放在栈区,而被static修饰的局部变量就会存放在静态区,静态区的变量的生命周期和全局变量是一样的
static修饰全局变量
第一种
代码1:
#include <stdio.h> int a = 12; int g_val() { printf("a_val():%d\n", a); } int main() { printf("a=%d\n", a); g_val(); return 0; }
结果:
第二种
可以看出全局变量有外部链接属性,这种属性决定了全局变量可以在多个文件使用
extern 声明外部符
当我们利用static修饰全局变量时
原因是啥呢?
其实被static修饰的全局变量会把全局变量的外部链接属性变成内部链接属性(就是全局变量不能跨文件使用,只能在自己的.c文件使用),注意存储的地方还是静态区,加了static修饰的全局变量只是告诉编译器 "这个全局变量你只能在自己的,c文件使用,,不能乱跑"
可以理解为改变了作用域