1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>
      (玩电子) 电子技术学习与研究
      当前位置单片机教程网 >> 基础教程 >> 浏览文章

      第十六课 C51指针的使用

      作者:佚名   来源:本站原创   点击数:x  更新时间2007年07月12日   字体

      指针就是指变量或数据所在的存储区地址如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中那么 DATA 区的 51H 地址就是变量 STR 的指针在 C 语言中 指针是一个很重要的概念正确有效的使用指针类型的数据能更有效的表达复杂的数据 结构能更有效的使用数组或变量能方便直接的处理内存或其它存储区指针之所以 能这么有效的操作数据是因为无论程序的指令常量变量或特殊寄存器都要存放在内 存单元或相应的存储区中这些存储区?#21069;?#23383;节来划分的每一个存储单元都能用唯一的 编号去读或写数据这个编号就是常说的存储单元的地址而读写这个编号的动作就叫做寻 址通过寻址就能访?#23454;?#23384;储区中的?#25105;?#20010;能访问的单元而这个功能是变量或数组等 是不可能代替的C 语言也因此引入了指针类型的数据类型专门用来确定其他类型数据的 地址用一个变量来存放另一个变量的地址那么用来存放变量地址的变量称为指针变量 如用变量 STRIP 来存放文章开头的 STR 变量的地址 51H变量 STRIP 就是指针变量下面 用一个图表来说明变量的指针和指针变量两个不一样的概念

      变量的指针就是变量的地址用取地址运算符&取得赋给指针变量&STR 就?#21069;?变量 STR 的地址取得用语句 STRIP = &STR 就能把所取得的 STR 指针存放在 STRIP 指 针变量中STRIP 的值就变为 51H可见指针变量的内容是另一个变量的地址地址所属的 变量称为指针变量所指向的变量

      要访?#26102;?#37327;  STR  除了能用STR这个变量名来访问之外还能用变量地址来访 问方法是先用&STR 取变量地址并赋于 STRIP 指针变量然后就能用*STRIP 来对 STR 进行访问了*是指针运算符用它能取得指针变量所指向的地址的值在上图中指针 变量 STRIP 所指向的地址是 51H而 51H 中的值是 40H那么*STRIP 所得的值就是 40H 使用指针变量之前也和使用其它类型的变量那样要求先定义变量而且?#38382;?#20063;相类似

      一般的?#38382;?#22914;下

      数据类型    存储器类型    *    变量名;

      unsigned  char  xdata  *pi    //指针会占用二字节指针自身存放在编译器默认存储区指

      向 xdata 存储区的 char 类型

      unsigned char xdata * data pi; //除指针自身指定在 data 区其它同上

      int * pi; //定义为一般指针指针自身存放在编译器默认存储区占三个字节 在定义?#38382;?#20013;数据类型是指所定义的指针变量所指向的变量的类型存储器类型

      是编译器编译时的一种扩展标识它是可选的在没?#23567;?#23384;储器类型选项时则定义为一

      般指针如?#23567;?#23384;储器类型选项时则定义为基于存储器的指针限于 51 芯片的寻址范围


       

      指针变量最大的值为 0xFFFF这样就决定了一般指针在内存会占用 3 个字节第一字节存 放该指针存储器类型编码后两个则存放该指针的高低位址而基于存储器的指针因为不用 识别存储器类型所以会占一或二个字节idata,data,pdata 存储器指针占一个字节code,xdata 则会占二个字节由上可知明确的定义指针能节省存储器的开销这在严格要求程序 体积的项目中很有用处

      指针的使用方法很多限于篇幅以上只能对它做一些基础的介绍下面用在讲述常量时 的例程改动一下用以说明指针的基本使用方法

      #include <AT89X51.H> //预处理文件里面定义了特殊寄存器的名称如 P1 口定义为 P1

      void main(void)

      {

      //定义花样数据数据存放在片内 CODE 区中

      unsigned char code design[]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

      0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

      0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

      0xE7,0xDB,0xBD,0x7E,0xFF};

      unsigned int a;    //定义循环用的变量

      unsigned char b;

      unsigned char code * dsi;    //定义基于 CODE 区的指针


       

      do{

      dsi = &design[0];    //取得数组第一个单元的地址

      for (b=0; b<32; b++)

      {


       

      }

      }while(1);

      }

      for(a=0; a<30000; a++); //延时一段时间

      P1 = *dsi;        //从指针指向的地址取数据到 P1 口

      dsi++; //指针加一

      为了能清楚的了解指针的工作原理能使用 keil uv2 的软件仿真器查看各变量和存储器的

      值编译程序并执行然后打开变量窗口如图用单步执行就能查到到指针的变量 如图中所示的是程序中循?#20998;?#34892;到第二次这个时候指针 dsi 指向 c:0x0004 这个地址这个地址 的值是 0xFE在存储器窗口则能察看各地址单元的值使用这?#22336;?#27861;不但在学习时能 帮助更好的了解语法或程序的工作而且在实际使用中更能让你更快更准确的编写程序或解 决程序中的问题


       

      发表评论告诉好友收藏此文关闭窗口

      文章评论

      相关文章

      ຣ11ѡ5app

        
        
        1. <em id="3qmea"><ol id="3qmea"></ol></em>
        2. <em id="3qmea"></em>

            
            
            1. <em id="3qmea"><ol id="3qmea"></ol></em>
            2. <em id="3qmea"></em>