本帖最后由 chengzepeng 于 2012-9-24 00:33 编辑  
 
51的C语言指针分两大类: 
 
1,通用指针,不管你用来访问程序数据区域还是内存都可以,缺点是占用3个字节,访问时间也超长。 
 
2,特定指针,就是指定区域的指针,缺点是不可以访问该区域外的数据,好处就是访问时间短。 
 
AT89C52的实测读取时间:内部RAM指针的读取需要5指令时间,指针读取代码需要9个指令时间,用通用指针读内部RAM要17个指令时间(可见效率低下)。 
 
用法: 先确定你的指针用在那个区域,然后在一个变量前面加个*号,去取某个变量的地址就是在变量前加个&,数组的话可以直接用数组名。 
 
如:- uint8_t idata *RP1;   // 指针在指定在内部RAM,data加不加i都一样,因为内部RAM是0-255,所以这个只要一个字节
 - uint8_t pdata *RP2;  // 指针在指定在外部RAM,这个是外部RAM的分页访问,也是用一个字节,速度和内部的差不多
 - uint16_t xdata *RP3;// 指针在指定在外部RAM,这个是外部整个区域的访问,占用2个字节
 - uint16_t code *RP4; // 指针在指定在代码区,这个是代码区的访问,只能读
 - uint8_t *RP5;          // 通用指针,这个是未指定区域访问,因为占用3个字节,所以访问速度超慢,不推荐使用[code]
 - 测试例子:
 - [code]#include<reg52.h>
 - #include <stdint.h>
 - #include <absacc.h>
 - sbit K0 = P1^0;
 - sbit K1 = P1^1;
 - sbit CS = P2^0;
 - uint8_t idata IRAM_BUF[128];
 - uint8_t idata *pdr;                                   // 指针区域定在内部RAM
 - uint16_t code *por;                                   // 指针区域定在代码
 - void delay_ms(uint8_t xms)
 - {
 -         uint16_t xus;
 -         for(;xms;--xms)
 -         {
 -                 for(xus=124;xus;--xus);
 -         }
 - }
 - void uart_init()
 - {
 -         // SMOD = 1,波特率加倍
 -     PCON |= 0x80;
 -         // SM0=0;SM1=1;SM2=0;REN0=0;TB8=0;RB8=0;TI0=0;RI0=0;
 -         // 串口模式1,8bit可变波特率,关闭接收
 -         SCON = 0x40;
 -         TMOD = 0x20;
 -         TH1  = 0xFF;        // 11.0592M时57600
 -         TR1  = 1;
 -         TI   = 1;
 - }
 - void UART(uint8_t TD)                                   // 串口发送函数
 - {
 -         while(!TI);
 -         TI = 0;
 -         SBUF = TD;
 - }
 - void main()
 - {
 -         uint8_t mi,mj;
 -         P3 = 0xFF;
 -         uart_init();
 -         for(mi=0;mi<128;mi++)
 -         {
 -                 IRAM_BUF[mi]=mi;
 -         }
 -         while(1)
 -         {
 -                 if((!K0)||(!K1))
 -                 {
 -                         delay_ms(100);
 -                         if(!K0)
 -                         {
 -                                 pdr=IRAM_BUF;                        // 将数组的起始地址取出来
 -                                 for(mi=128;mi!=0;mi--)
 -                                 {
 -                                         CS = 0;                         // 测试IO
 -                                         mj = *pdr;                 // 读出数据
 -                                         CS = 1;
 -                                         ++pdr;                        // 指针自加1
 -                                         UART(mj);
 -                                 }
 -                         }
 -                         else if(!K1)
 -                         {
 - // 听说直接对指针赋值不合法,不过实际测试可以用也没有警告
 -                                 por=0;
 -                                 for(mi=0;mi<128;mi++)        // 从代码区读出128字节
 -                                 {
 -                                         CS = 0;
 -                                         mj = *por;
 -                                         CS = 1;
 -                                         ++por;
 -                                         UART(mj);
 -                                 }
 -                         }
 -                          while((!K0)||(!K1));
 -                 }
 -         }
 - }
 
 
  
 
 |