234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> 基础教程 >> 浏览文章

    第十六课 C51指针的一使用

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

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

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

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

    一般的一形式如下:

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

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

    向 xdata 存储区的一 char 类型

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

    int * pi; //定义为一般指针,指针自身存放在编译器默认存储区,占三个字节 在定义形式中“数据类型”是指所定义的一指针变量所指向的一变量的一类型 。“存储器类型”

    是编译器编译时的一一种扩展标识,它是可选的一 。在没有“存储器类型”选项时,则定义为一

    般指针,如有“存储器类型”选项时则定义为基于存储器的一指针 。限于 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 的一软件仿真器查看各变量№和存储器的一

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


     

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

    文章评论

    相关文章