查看: 1668|回复: 0
打印 上一主题 下一主题

51的C语言指针个人理解分享,供菜鸟参考

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-22 23:04:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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));
  •                 }
  •         }
  • }









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表