引言
在c语言的学习中我们能发现一个特点:不能重复声明同一个变量名
int main()
{
int a; //声明一个int类型的变量a
int a; //报错:a重定义,多次初始化
char a; //报错:a重定义,不同的基类型
return 0;
}
这是一个通过生活/业务逻辑就能理解的概念,因为遇到同名同姓的人,日常生活一定会将他们做出区分
如果他们叫法完全一样将会很麻烦,代码也是如此,否则打印时,a到底打印哪个?
但是我们会发现一个神奇的现象,当我们使用选择/循环/自定义函数时,我们是允许相同变量名出现的:
int main()
{
int a = 0;
if (a == 0) //main中a = 0 满足条件
{
int a = 10;//声明了一个if当中的a变量,并初始化,赋值为10
printf("if里的a:%d ", a); //打印if当中的a
}
printf("main中的a:%d\n", a); //打印main当中的a
return 0;
}
上述例子中打印结果时if当中的a:10 main当中的a:0
想要理解这个原因和道理,这就是这个笔记想要讨论的问题。
---------------------------------------------------------------------------------------------------------------------------------
存储类别(storage class)
内存
了解存储类别前,先简单了解内存的概念。
我们一般了解的内存:运行内存,容量,4GB,8GB,1TB...
通俗点理解内存就是计算机给你提供的一些可操作的空间
类比一下,内存就像是计算机规划了既定的房间,你可以在里面规划出不同的空间区域,在这个房间里放入各种各样的东西。
而我们定义的每一个值,就比如你在编译器中写下一个int a = 0;诸如此类都会占用一定的内存空间。
什么是存储类别
我们光知道有了这个房间,但我们该如何有效的利用空间呢?
首先,我们构思一个场景:我们在房间里面用餐巾纸,抽一张,用完丢到了垃圾袋,当垃圾袋满了是需要把垃圾袋丢掉的吧。那如果我们一直制造垃圾,一直不处理垃圾,最后房间注定就会变成垃圾堆的。
计算机的内存也是如此,而当我们运行程序的时候,一行int a = 0;的代码使用了内存这个空间的一部分,我们忽略了一个问题,当我们用完了变量a,我们并没有执行“丢掉垃圾袋”的操作。
---------------------------------------------------------------------------------------------------------------------------------
事实上,通常情况下,当定义的变量变成垃圾的时候,我们的计算机都会自动帮我们销毁,释放出被“垃圾”占有的空间,以便我们更有效地利用内存。这就是自动变量的概念。
我们的c语言提供了不同的模型方便我们有效的使用内存。俗点理解就是:让计算机知道,什么是垃圾。
这些所谓的模型创造就是依靠着存储类别的。自动变量,就是拥有“自动”这一存储类别的变量。
存储类别提供了什么?
是方便了程序员在编写的代码中指定变量应当是什么类型的工具,存储类别提供了程序员对代码生命期的可控性和可见性
通俗点说,就是你可以指定什么东西在什么时候会变成垃圾
---------------------------------------------------------------------------------------------------------------------------------
存储期/生命期
以上我们提到了一个特殊的名词:生命期,或者叫存储期。
存储期描述各种变量/对象的生存期
简单来说,就是用来指定什么东西什么时候变成垃圾的。