1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C:内存中供用户使用的存储空间

C:内存中供用户使用的存储空间

时间:2020-10-19 13:44:31

相关推荐

C:内存中供用户使用的存储空间

内存中供用户使用的存储空间可分为:

代码区:存代码的地方。常量区:存常量的地方。静态存储区:存变量的地方。动态存储区:存变量的地方。

存变量的分为静态存储和动态存储两个区;

“静态”表示事情发生在程序构建的编译时和链接时(还没有运行呢),而非程序实际开始运行的载入时和运行时。也就意味着静态存储区的变量他的分配内存是在编译的时候就已经分配了,不是在运行的时候临时分配。

“动态”表示事情发生在程序载入时和运行时。

变量的存储类型是指在内存中存储(编译器为变量分配内存)的方式。

静态存储方式:是指在程序运行期间(因为在编译的时候就已经分配好了,所以在程序运行期间他是始终占有分配好的内存的)分配固定的存储空间的方式,不会发生变化。

存储类型决定了变量的生存期。变量的数据类型决定的是变量在分配内存的时候,分配的内存字节数的大小等等(包括可参与的运算类型等等)。存储类型决定了你分配的这个变量他的生存期有多长,何时生何时灭;而静态分配的数据,因为他是编译阶段分配的,所以说他在整个程序的生命周期内,全过程内他是始终占据着内存的,寿命比较长,它是与程序共存亡的,你什么时间程序结束了,我才释放掉。而动态存储区的变量是和语句块共存亡的,我退出这个函数了我就自动释放了,我退出这个复合语句了我就把分配的内存给释放掉了,他的值就已经没有了。

如何声明变量的存储类型?

//参照以前声明变量的数据类型是:数据类型 变量名;//在数据类型的前边加上存储类型,就可以声明这个变量的存储类型了。存储类型 数据类型 变量名;

存储类型声明他的时候需要一些关键字:(C存储类型关键字(有4种))

第一种:auto(自动变量)(auto声明和不声明是一样的)

自动变量(又称为动态局部变量)他是系统缺省的存储类型。我们可以在前边加上auto也可以省略。

auto 数据类型 变量名;//加auto显示的声明他是一个自动变量,不加auto的时候在函数内部定义的变量他会缺省为就是一个自动变量。

自动变量因为他是动态局部的,(局部的就是他肯定是在一个语句块内声明的,在语句块内定义的,那就是他进入这个语句块的时候呢,来申请内存,退出的时候就要把它申请的这个内存给释放掉,所以呢他只有在进入这个语句块内的时候才占有内存,所以他的生存期是与这个语句块是共存亡的,这也就是他一个动态的含义,那我们就说他分配的内存不是在静态存储区,是在动态存储区域,那离开这个函数的时候因为你释放了这个内存,所以这个值就消失了)所以动态局部变量离开函数值就消失了,变成随机数了。

接static下边的程序改变:改成自动变量这个程序的输出是什么样的,还有记忆功能吗?

自动变量的特点,是在进入这个函数的时候才分配内存,分配内存就意味着分配内存的时候进行了初始化,因为在定义的时候给他初始化了,每次进入的时候都要分配内存进行初始化,所以每次调用Func进入他的时候p的值都是1,那一共调用了n次,每次传入的值不同,所以就是在1的基础上乘上了不同的值,所以这个输出的结果并不是阶乘值,而是都是在1的基础上进行乘,没有实现累乘的结果。

自动变量和静态变量的区别:

第一点:是自动变量不能够保留上一次调用结束的那个值,static静态变量是能够保留上一次调用结束的那个值。

第二点:是初始化不同,static是在编译的时候就已经初始化了,auto在每次进入函数的时候都重新进行初始化。

静态变量和全局变量因为是在编译的时候进行初始化,所以即使你不给他显示的(强制的进行初始化)进行初始化为某一个值,那他的值会自动初始化为0;但是自动变量不行,自动变量如果你不初始化的话,他的值就是随机值(如果给他初始化那他就是每次进入的时候他都会重新进行初始化)。

第二种:static(静态变量)

static 数据类型 变量名;

他是从程序运行起就占据着内存,整个程序退出时才释放的内存。(所以离开函数值是永远保留的,静态变量可以在函数内或者语句块内去定义,那这个就叫做静态局部变量。如果在所有函数外边去定义的话,那他就是一个静态的外部变量。那两者的区别呢?都是静态的,都在静态存储区分配内存,但是作用域是不同的。都在静态存储区分配内存,他的生存期是相同的,但是一个是局部的一个是外部的,所以他的作用域是不同的,局部变量只局限在这个语句块内,而外部变量是在从定义点到程序结束,所有的函数内,这个都是能够访问的;所以作用域不同,一个是语句块内,一个是文件内)

在函数内部声明了一个静态局部变量,这个静态局部变量的特点呢?因为他是在静态存储区分配的内存,那么他是从编译的时候就开始分配了,所以那个时候只初始化一次,也就是说第一次进入Func这个函数的时候他的值是1,等第二次进入这个函数的时候就保留上一次调用结束的那个值。

PS:所以我们发现一个特点,静态变量是在编译的时候初始化的,而且只初始化1次。(运行的时候他就始终保留上一次函数调用结束的那个结果了,所以这个变量的值一直可以保存到下一次进入函数的时候,说明使得这个函数具有了记忆的功能(这就是为什么上边的那个程序为什么可以求出累乘的结果,就是定义了这个静态变量之后,使得它具有记忆功能了,能够记住上一次结束的那个值))

把静态变量改成自动变量:见auto下边的程序

第三种:extern(外部变量)(这个和我们在所有函数外边定义一个全局变量的区别是:全局变量的作用域是从定义点开始到程序的结束,如果我在定义点之前想使用这个全局变量,就不能使用;假如我想在定义点之前使用该怎么办呢?必须声明一下,声明一下说我后面定义了这个全局变量,他是一个全局变量,那extern就起到了这么一个声明作用。编译器对他的态度就是并不真正的分配内存,如果你这个地方分配内存,到定义点的那个位置你还再分配一次内存,那就是错的;所以他并不对他进行分配内存,他只是表明了用extern声明告诉编译器我后边有一个全局变量定义,在这之前我要用一下,那编译器的态度就是我知道了有这么一个全局变量。)

第四种:register(寄存器变量)(寄存器变量它存储的地方是在CPU当中,CPU当中有少量的寄存器,那存储的位置不是在内存当中,是在CPU的寄存器当中的,)

上述前三种都是在内存里边的,而第四种寄存器变量是在CPU内部的,不是在内存里边的,在CPU内部容量非常有限的,但速度极快的这样的一个存储器,(速度快因为CPU直接与他内部的寄存器打交道当然快呀。你和内存的话,CPU和内存进行读写的话就要慢一些。所以此处速度快但是容量有限,)寄存器变量的生存期它是与程序共存亡的。

//寄存器变量的声明方法register 类型名 变量名;

什么情况下要声明为寄存器变量呢?(因为他速度快,所以使用频率比较高的,这样的变量我们一般把他定义为寄存器变量;可以使你的程序更短小,执行速度更快;但是没有必要刻意的去这么做,因为现代编译器他有能力,把普通的变量给你优化为寄存器变量;意思就是他觉得这个变量使用频率比较高,他会自动给你优化为寄存器变量,就会忽略你用户的指定,你即使指定为自动变量,他可能也忽略这个指定,所以说我们一般的情况下不需要特别的单独的去声明这个寄存器变量。)

总结:

全局变量的作用域是从定义点开始到程序结束;局部变量是指在定义这个局部变量的语句块内、函数内、或复合语句内是他的作用域,是可以访问的范围。如果要在定义点之前使用这个全局变量,需用extern声明。

静态和非静态的。区别在于作用域不同:静态全局变量只限在本文件内使用,只限在定义这个静态外部变量的本文件内使用(所以在两个文件内可以定义同名的两个静态变量,因为你在你的文件内有效,我在我的文件内有效)。如果没有静态声明的话,你定义的全局变量他是在所有的源文件内都可以使用它都是有效的。

动态局部变量我们也称他为自动变量(这个是缺省的存储类型,就是你存储类型如果不声明的时候呢,自动缺省为自动变量)。

自动变量的特点就是离开函数的时候因为内存释放了,所以值就消失了。形参也是属于动态局部变量,所以形参的值不会返给实参就是这样的,那离开他值就消失了,内存释放了,进入他的时候再分配内存。故函数传参只是单向的,由实参传递给形参。

而静态局部变量从编译的时候就已经分配内存了,和全局变量一样都是在编译的时候分配内存,分配的时候始终占据这个内存,一直到程序结束,所以因为是局部变量嘛,局部变量有可能会离开呀,离开这个函数,离开他的作用域,离开他的作用域之后呢因为是局部的,你不能访问他了,但是他的值还保留着,因为他是静态的,值还给你保留着。

所以一种便捷的记忆方式就是,静态变量就是你的学生宿舍,放假回来还是这个宿舍;动态局部变量理解成宾馆的这个房间,走之后就没了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。