【CPP.Chap12】存储类、链接和内存管理——渣渣的艰苦学习

今晚看完这一章啦!为加入工作室奋战!!!=( ̄ˇ ̄)v

C为变量提供了五种存储模型/存储类,对于一个变量,可以按照存储时期、作用域以及链接来描述它。

一、( σ‘ω‘)σ关于作用域、链接、存储时期:

  • 作用域(scope):分为①代码块作用域(block scope)②函数原型作用域 (function prototype scope)③文件作用域(file scope):指在所有函数之外定义的变量④*函数作用域(function scope):只适用于goto语句,暂不涉及。
  • 链接(linkage):分为①外部链接(external linkage)②内部链接(internal linkage)③空链接(no linkage)
  • 存储时期(storage duration):即变量在内存中保留的时间。分为①静态存储时期(static storage duration):该类变量在程序执行期间一直存在。②自动存储时期(automatic storage duration):为变量分配临时内存,完成其所在代码快操作后内存将被释放用于其他用途。

二、于是接下来就可以说明下这五种存储类啦o(* ̄▽ ̄*)ブ:

 

  • 自动变量:具有自动存储时期、代码块作用域、空链接(其实我不太理解空链接什么意思(=。=)。。。),其存储类说明符:auto

Q: 如果在代码块内和代码块外使用同一变量名会怎样?

于是写段小程序。。。

 1 #include<stdio.h>
 2 int main()
 3 {
 4      int i=100;
 5         {
 6              int i=10;
 7               printf("inner i=%d\n",i);
 8         }
 9     printf("outer i=%d\n",i);
10     return 0;
11 }

结果:

综上说明,这种情况下内层定义会覆盖(hide)外层定义当程序运行离开内层代码块,外部变量又会重新恢复作用

  • 寄存器变量:寄存器变量会被存储在可以比普通内存更快访问和操作的地方(如果register请求在计算机的权衡下被允许,则可存储于CPU寄存器中,除此,会以自动变量类型存储在较快内存中)。它在很多方面跟自动变量是一样的(同样是自动存储时期、代码块作用域、空链接),但它是存放在寄存器中而非内存中,所以无法获得其地址。其存储类说明符:register(*注意:即使是auto但名义上仍是register,无法使用地址运算符)
  • 具有代码块作用域得静态变量:具有静态存储时期、文件作用域、外部链接的变量。静态变量(static variable)所谓的“静态”,是指变量所在位置不变,存储类说明符:static

关于static的用处(> v <):

 1 #include<stdio.h>
 2 void exe();
 3 int main()
 4 {
 5     int i;
 6       for(i=0;i<10;i++)
 7         exe();
 8     return 0;
 9 }
10
11 void exe()
12 {
13     int fade=0;
14     static int stay=0;
15     printf("fade=%d,stay=%d\n",fade++,stay++);
16
17 }

结果是酱紫的:

╰( ̄ω ̄o) 由上图可见,每次调用函数,fade不会记得上次自己的数值,因此每次从初始化时的数值开始;而static类型的stay则记得每次调用后的数值,并每次从记忆数值开始操作,即完成了代码块内的“静态”。

<(* ̄ー ̄)ゞps:对于函数参量是不可以使用static的,如下就不允许:

int hahaha(static int aho);//不允许哟!

  • 具有外部链接的静态变量:即将定义声明放在所有函数之外的变量,具有文件作用域、外部链接、静态存储时期。这一类型被称作外部存储类(external storage class)(( ̄▽ ̄")传说中的“类”?),该类变量被称为外部变量(external variable)。在使用外部变量的函数中使用关键字:extern来再次声明它。

*( ̄_ ̄|||)其实看到这里并没看懂,关于具体怎么用extern。。。试试看吧。。。

写了段小代码以及N次小变动:

在函数中输出外部变量yui的值:

在声明外部变量时赋初值:

 1 #include<stdio.h>
 2 int yui;
 3 void exe();
 4 int main()
 5 {
 6     exe();
 7     return 0;
 8 }
 9
10 void exe()
11 {
12     extern int yui;
13     yui=233;
14     printf("yui=%d\n",yui);
15
16 }

成功输出"yui=233"。

①*对函数的小变动:

1 void exe()
2 {
3     extern int yui=233;
4     printf("yui=%d\n",yui);
5 }

然后就没有然后了。。。错误提示:变量不能同时是extern&&initializer。。。

在声明yui同时赋值,在函数的int前不加extern:

 1 #include<stdio.h>
 2 int yui=233;
 3 void exe();
 4 int main()
 5 {
 6     exe();
 7     return 0;
 8 }
 9
10 void exe()
11 {
12     int yui;
13     printf("yui=%d\n",yui);
14 }

结果:

如果不给yui赋初值,结果也是这个。此处函数中的yui为一个独立的局部变量,暂时性hide了外部变量

直接在函数中输出yui:

1 void exe()
2 {
3     printf("yui=%d\n",yui);
4 }

输出"yui=233",说明外部变量对整个文件各代码块都是可识别的。

如果在整个程序中间某处声明外部变量,该外部变量对其之前函数不可见,对其之后函数则可见

变量定义与变量声明,如图:

1 #include<stdio.h>
2 int yui=233;//变量定义,必须有
3 void exe();
4 int main()
5 {
6    extern int yui;//变量声明,可读性高,不影响程序,可以没有。这里的声明称“引用声明(referencing declaration)”
7     exe();
8    return 0;
9 } 

Σ(  ̄д ̄;)四点了,果然又。。。没看完,算了已经习惯了QAQ明天继续。。。

 

时间: 2024-08-16 21:23:33

【CPP.Chap12】存储类、链接和内存管理——渣渣的艰苦学习的相关文章

CPrimer Plus第12章 存储类、链接和内存管理随笔

被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修饰的变量不会中途被释放,所以不能用static修饰函数的形参变量的定义放在所有函数定义的外部即创建了一个外部变量,若外部变量在其他文件中定义,则需见extern修饰全局变量只能用常量表达式来赋值:int i;    int j = 2*i;不被允许 ptd = (double *)malloc(n

C语言--存储类、链接和内存管理

注:此文为<C Primer Plus>一书中的部分总结,写下来方便以后参考. 用于存储程序数据的内存可用存储时期.作用域和链接来表征. 存储时期可以使静态的.自动的或者分配的.①如果是静态的,内存在程序开始执行时被分配,并行程序运行时一直存在.②如果是自动的,变量所用内存在程序执行到该变量定义所在代码块时开始分配,在退出代码块时释放.③如果是分配的内存,内存通过调用malloc()(或其他相关函数)分配,通过调用函数free()释放. 作用域决定哪一部分程序可以访问某个数据.在所有函数之外定

C Primer Plus (第五版) 第十二章 存储类、链接和内存管理 编程练习

第十二章 存储类.链接和内存管理 编程练习 1.Q不使用全局变量,重写程序清单13.4 #include <stdio.h>; int critic(int u); int main(void) { int units; printf("How many pounds to a firkin of butter?\n"); scanf_s("%d", &units); while (units != 56) critic(units); prin

C存储类、链接和内存管理——存储类

存储类 @[toc] C为变量提供了5种不同的存储类型: 自动 寄存器 具有代码块作用域的静态 具有外部链接的静态 具有内部链接的静态 不同角度描述变量: 存储时期 变量在内存中保留的时间 变量作用域(Scope)以及它的链接(Linkage) 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来访问该变量 不同的存储类提供了变量的作用域.链接以及存储时期的不同组合. 作用域 作用域分为: 代码块作用域(block scope) 代码块在C中指的是一对花括号之间.定义在代码块之间的变量其可见

C存储类、链接和内存管理--动态分配内存及类型限定词

目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restrict关键字 @ 存储类说明符 C中存储类说明符共有5个,为auto register static extern typeddef,最后一个关键字typedef与内存存储无关. 规定:不可以在一个声明中使用一个以上存储类说明符. 存储类说明符用来确定变量的存储类型. 存储类和函数 函数的存储类有两

存储类、链接、内存管理

作用域:代码块作用域.函数原型作用域.文件作用域 函数作用域(只适用于goto) 链接:外部链接.内部链接.空链接(代码块作用域.函数原型作用域) 存储时期:静态存储时期.自动动态存储时期 五种存储类:自动,寄存器(代码块内使用register,不能使用地址运算符),外部链接的静态.内部链接的静态(static).空链接 x =30;while(x++<33){ int x = 100; printf("%d",x); } 打印了三次100,递增必须在条件判断语句中 对函数参量不

C Primer Plus之存储类、链接和内存管理

存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个标识符的一个或多个区域.一个C变量的作用域可以是代码块作用域.函数原型作用域,或者文件作用域. 在代码块中定义的变量具有代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾该变量均可见.其次,函数的形式参量尽管在函数的开始花括号前进行定义,同样也具有代码块作用域,隶属于包含函数体的代码块.

存储类、链接和内存管理(c prime plus)

首先介绍三个概念: (1)作用域:作用域描述了程序中可以访问一个标识符的一个或多个区域. 一共有三种作用域:代码块作用域.函数原型作用域和文件作用域 a.代码块作用域:一个代码块是包含在开始花括号和对应结束花括号之间的一段代码,在代码块内定义的变量具有代码块作用域,从该变量定义的地方到包含该定义的代码块的结尾该变量均可见. 传统上,具有代码块作用域的变量都必须在代码块的开始处进行声明,c99放宽了这一规则,允许在代码块的任何位置声明变量,譬如说for循环的控制部分,类似的还有while循环.do

存储类、链接和内存管理

关键字: auto.extern.static.register.const.volatile.restricted. 函数: rand().srand().time().malloc().calloc().free(). 不同的存储类提供了变量的作用域(scope).链接(linkage)以及存储时期(storage duration)的不同组合 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量 作用域:一个C变量的作用域可以是代码块作用域.函数原型作用域.或者文件作用域.