C与数据结构——数据区(二)

       昨天《C与数据结构——概述(一)》的码字,都是文字,自己看了都糊涂。技术类的东西,文字太多有时候真的不爽。像代码这种东西,喜欢直观认识的人常常直接看代码,才看文字。代码直观,文字简洁。水平太菜,没办法简洁。今只能这样,先弄个形式:

--------------------------------------------------------------------
# include<stdio.h>
# define uchar unsigned char
  uchar c[5]={0,1,2,3,4};   //全局变量
  extern int   pi=3.14      //extern 全局变量
  void main()               //main()函数 
       {
         int f(int x);
         char i;    //局部变量隐性规则,省掉前缀auto
         static int a=2;   //静态局部变量
         char *p=0;        //地值是可以为0的,其实大于0就行。                  
       }
  int f(int x)             //数据操作函数 ,有返回值     
 {
  int a=2;
         register long i; f=1 //寄存器变量
  static int c=3;
  {
          int c;           //程序块里定义的局部变量
  :
  ;
  }
 }

--------------------------------------------------------------------

   计算内都是玩的都是数据处理,写算法也就是对数据区数据的处理步骤。函数即使一些数据操作步骤的集合.现在就说说数据区怎么初始化,以给后面函数算法使用。
    数据区的初始化,其实就是写代码时,弄的常量,变量等,常量我认为是同时给了地值和数值。而变量名给地址,初始化给数值如uchar c[5]={0,1,2,3,4}; ;这是定义也同时初始化了。变量又有全局变量和局部变量之分。静态变量和自动变量。
    全局变量和局部变量——数据区访问权限,所有的算法指令都可以访问,访问一般指读写,即取出数据和修改写回内存。
    内存里,用户可以使用的存储空间有三部分:程序区,静态存储区,动态存储区。
    静态存储区——全局变量,用static声明定义的所有函数里边的局部变量。说明,以下载录谭老先生:------------------------------------------“数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态的进行分配和释放。”
    动态存储区——函数形式参数、自动变量、函数调用时的现场保护和返回地址。这些数据,以函数为中心,都是函数调用时开始分配动态存储空间,函数结束时释放这些空间。应用例子:

--------------------------------------------------------------------

   void deletelist(list L)  //删除表,即要从存储空间删掉
     {
   position p,tmp;   //局部变量,调用时分配临时内存,函数结束自动销毁,不用担心遗留问题
          p=L->next;
   L->next=null;    //地值交给p这个临时小弟,自己清空先撤      
   while(p!=null)
   {
     tmp=p->next;
     free(p);
     p=tmp;
    }
 }

--------------------------------------------------------------------

    从程序执行的角度来理解静态局部变量和动态局部变量总结,直接用谈老先生的了:
    (1)静态局部变量属于静态存储类别,在静态存储区分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后即释放。
     (2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它们已有初值。以后每次调用函数是不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
    (3)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则她的值是一个不确定的值,这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所有分配的单元中的值是不确定的。
    (4)虽然静态局部变量在函数调用结束后仍然存在,但其他的函数是不能引用它的。

     到这,数据区分析就差不多了,从代码角度总结一下:
     数据区有全局变量,extern变量;局部变量、静态局部变量,寄存器变量。看代码,全局只考虑读写权限,即作用域,谁可以操作它,静态存储区是固定的。局部的数据,就看存储区,有动态存储区的和静态存储区的,因为读写权限是固定的,代码块里面{}。
     之所有喜欢C,其实就是因为,学到C51才认识到其强大。嵌入式里边,C,C++是王道。至于对某款控制器,或者处理器ARM操作,全局变量是定义好的,如reg51.h文件里宏定义了,全局变量对应的21个特殊的寄存器地址。下一篇,改分解对数据区的操作了。
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值