zoukankan      html  css  js  c++  java
  • 我也要学C语言第十一章:自动变量,静态变量和寄存器变量

      大家好!我已经学习C语言1周啦!但是到现在都还没有接触到灵魂“指针”!我看了看我买的全部书关于指针的说明都很厚呢!预计指针的学习要占1半的学习时间(差不多1周的时间),差不多,第一次学完C语言需要2周时间,然后是汇编,操作系统原理,大约需要花费2个月时间。然后我打算边学习C++然后结合其反汇编代码进行学习,大约需要2周时间(也就是每写一行C++,然后写出对应的汇编代码。我想呢!C是C++的子集,这样应该没问题。)然后再学习C语言有关设计的部分,这部分我严格按照“系统程序员的成长计划”进行学习,预计需要2个月时间。然后再进行2周的从汇编到C++的反向学习,然后就进行WINDOWS程序设计的学习了,WINDOWS程序的设计大概要学2个月时间,然后就是WINDOWS内核驱动的学习大概要花2个月时间,然后就进行自我项目实践了!最后的实践项目我初步是定为,自己实现一个用户态和内核态调试器。上面的学习计划差不多是一年的时间!(在这里要谢谢指点我学习方向的计算机前辈!)

    一:自动变量,静态变量和寄存器变量的定义:  

      根据变量存储位置不同,变量还可以分为自动变量,静态变量和寄存器变量

      自动变量:局部没有经过任何修饰的局部变量叫自动变量 (它存在于动态数据区——栈),这个区域内的数据随着程序的运行动态的生成和释放,函数返回就释放,函数要调用就生成。关键字:默认是atuo(一般不写).

      自动变量的特点:当程序执行到自动变量的作用域的时候就分配,不是到了声明代码才分配哦!到了代码分配就晚啦!当定义自动变量的函数执行结束后,程序将释放该自动变量的存储空间,留给其他自动变量使用。事例:

    #include <stdio.h>

    void add(int n)
    {
    auto
    int s =0;
    s
    = s +1;

    printf(
    "No.%d: s=%d\n", n, s);
    }

    void main()
    {
    int i =1;

    for(i; i<4; i++)
    {
    add(i);
    }
    }

    输出为:

    No.1: s=1
    No.2: s=1
    No.3: s=1
    
     

    从这个例子不难看出,自动变量的初始值在每次分配存储空间后都要重新赋值。

      静态变量:静态变量其实也存在于数据区和全局变量是一样的。但是静态变量在编译器级别有所限制(编译器对于静态变量的访问做了限制(对内存空间的限制有两种级别,一种是编译器级别,这种访问限制其实是编译器在做语法检查;第二种情况是操作系统级别,这种情况,要是你强制访问,操作系统可能会蓝屏或者报警告错误!))。调试证明:

    这个证明:静态变量其实也存在于数据区和全局变量是一样的.

    再看这个例子:

    这里为什么会编译错误呢!显示x没有定义。这当然大家都知道,但是为什么呢?!同样是数据区的东西为什么访问不了!我们再来看下下面的代码:

    这里可以看到。0x88888888和0x12312312明明就是在一块的,为什么就不能访问呢。原因看下面的图(注意:下面是打开的.obj文件,也就是链接之前的那个文件):

    我们把这些信息用注释的方式写到代码里看起来要好些:

    我们从这里可以清楚的看到,静态变量被重新命名了,所以造成了无法访问的问题。注意看重命名的规则,它集成了它所在的函数信息,变量和函数绑定了。有一定的规则!不过这个在编译器内部规定,不同编译器的规则是不一样的。只要知道静态变量的原理即可。

      静态变量生存周期:和全局变量一样,从可执行文件被加载到程序结束(它出生比main函数早,死亡比main函数晚)。

       局部静态变量:它的存储区还是在数据区。

       全局静态变量无法夸文件,也是编译器级别的控制。

       静态变量的作用:实现私有。

      寄存器变量:我觉得这个可以不用说了,因为我通过调试和实践发现寄存器变量分明就是鸡肋!不用管它!

    唉!学了8小时了,头有点晕乎乎的了!我去逛逛街回来再继续!

      

  • 相关阅读:
    Delphi 使用字符串时,一个注意地方
    Delphi 字符串 详解
    Delphi SEH研究
    Delphi 新语法之Helper
    Delphi 判断一个二进制数中有多少个1
    Delphi 数据的理解
    Delphi 对象构造浅析后续
    Delphi 关于错误E2154 Type '%s' needs finalization not allowed in variant record
    Delphi 新语法介绍之For In
    Delphi 关于错误E1038 Unit identifier '%s' does not match file name
  • 原文地址:https://www.cnblogs.com/dodolook/p/2059254.html
Copyright © 2011-2022 走看看