先来个大总结:
a.变量的存储方式:动态存储(自动、寄存器)、静态存储(静态和外部)
b.由变量的存储方式不同而产生的特性称为变量的生存期(变量的存在时间)
c.基本类型的静态变量系统默认赋初值为0
d.静态变量的生存期为整个源程序,作用域只是定义它的文件(若程序由一个源文件构成时,全局变量与全局静态变量没有区别。)(第四个例子)
e.函数被调用时,其中的局部静态变量的值保留前次被调用的结果
f.根据变量的作用域可以将变量划分为:局部变量和全局变量
---------------------------------------------------------------------------------------------------------
什么代码块:程序中被一对大括号括起来的区域就叫代码块。分支语句、循环语句等也是代码块。
函数体里肯定有很多个代码块。但是“作用域”是不同的。
作用域:顾名思义,就是变量起作用的范围,也就决定了变量的可访问性。
先看下这个代码:
int main()
{
int num = 9;
{
int num = 90;
printf("%d\n",num);
printf("-----\n");
}
printf("%d\n",num);
卧槽,竟然发现两个不同的变量的名字是可以再同一个mian函数里的,但是它们作用的范围不一样,也就是说它们不是同一个空间里。
再把程序改一下
报错信息说num2没有被定义。
但是这样的话就有结果,说明再同一个main下小的作用域可以用大的(变量),而大的不能用小的(变量)
--------------------------------------------------------------------------------------------------------
变量只存在于定义它们的代码块中;变量存在的时间称为变量的生存期。
-------------------------------------------------------------------------------------------------
下面来介绍变量的存储类型:
分为四种:
a.自动变量:格式 auto 类型名 变量名;auto int temp;auto是可以省略不写的,所以如果没有指定变量的存储类型,那就是自动变量了
b.寄存器变量:寄存器就在cpu上,速度仅此于cpu,少用好吧,除非是达到几十万次的循环,否则就牛刀小试了
c.静态变量:若想保持上一次退出函数前所拥有的值,就用它,下面举例也会用到,它的生存周期从程序开始到程序结束。
d.外部变量:没什么要多注意的点,就是生存周期和静态变量差不多,下面举例的代码会用到
第一个例子:用static
发现设置了静态变量后count就=4了,不用的话count就是局部变量了,它每次都会初始为0.去掉的话就是count = 1。
第二个例子:局部变量。
函数调用一结束,局部变量的空间就被释放了。所以值还是5和8。
第三个例子:
在函数里面定义一个数组,再在主函数里调用,因为是局部变量,所以全部打印的就不是函数里设置的。打印的是随机的。
第四个例子:注意的点:a.全局变量的作用域就是当前源文件,其他文件不行,若其他文件想要调用,就得同extern来引入这个变量
main.c中代码:
one.c中代码: