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小时了,头有点晕乎乎的了!我去逛逛街回来再继续!

      

  • 相关阅读:
    PAT 1088. Rational Arithmetic
    PAT 1087. All Roads Lead to Rome
    PAT 1086. Tree Traversals Again
    PAT 1085. Perfect Sequence
    PAT 1084. Broken Keyboard
    PAT 1083. List Grades
    PAT 1082. Read Number in Chinese
    求最大公因数
    [转载]Latex文件转成pdf后的字体嵌入问题的解决
    [转载]Matlab有用的小工具小技巧
  • 原文地址:https://www.cnblogs.com/dodolook/p/2059254.html
Copyright © 2011-2022 走看看