码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-01 07:01:44      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

今晚看完这一章啦!为加入工作室奋战!!!=( ̄ˇ ̄)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明天继续。。。

 

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

标签:

原文地址:http://www.cnblogs.com/suzyc/p/4382653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!