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

2020-01-26 12:54发布

本帖最后由 chengzepeng 于 2012-9-24 00:33 编辑

51的C语言指针分两大类:

1,通用指针,不管你用来访问程序数据区域还是内存都可以,缺点是占用3个字节,访问时间也超长。

2,特定指针,就是指定区域的指针,缺点是不可以访问该区域外的数据,好处就是访问时间短。

AT89C52的实测读取时间:内部RAM指针的读取需要5指令时间,指针读取代码需要9个指令时间,用通用指针读内部RAM要17个指令时间(可见效率低下)。

用法: 先确定你的指针用在那个区域,然后在一个变量前面加个*号,去取某个变量的地址就是在变量前加个&,数组的话可以直接用数组名。

如:

  1. uint8_t idata *RP1;   // 指针在指定在内部RAM,data加不加i都一样,因为内部RAM是0-255,所以这个只要一个字节
  2. uint8_t pdata *RP2;  // 指针在指定在外部RAM,这个是外部RAM的分页访问,也是用一个字节,速度和内部的差不多
  3. uint16_t xdata *RP3;// 指针在指定在外部RAM,这个是外部整个区域的访问,占用2个字节
  4. uint16_t code *RP4; // 指针在指定在代码区,这个是代码区的访问,只能读
  5. uint8_t *RP5;          // 通用指针,这个是未指定区域访问,因为占用3个字节,所以访问速度超慢,不推荐使用[code]

  6. 测试例子:

  7. [code]#include<reg52.h>
  8. #include <stdint.h>
  9. #include <absacc.h>

  10. sbit K0 = P1^0;
  11. sbit K1 = P1^1;
  12. sbit CS = P2^0;

  13. uint8_t idata IRAM_BUF[128];
  14. uint8_t idata *pdr;                                   // 指针区域定在内部RAM
  15. uint16_t code *por;                                   // 指针区域定在代码

  16. void delay_ms(uint8_t xms)
  17. {
  18.         uint16_t xus;
  19.         for(;xms;--xms)
  20.         {       
  21.                 for(xus=124;xus;--xus);
  22.         }
  23. }

  24. void uart_init()
  25. {
  26.         // SMOD = 1,波特率加倍
  27.     PCON |= 0x80;                                        
  28.         // SM0=0;SM1=1;SM2=0;REN0=0;TB8=0;RB8=0;TI0=0;RI0=0;
  29.         // 串口模式1,8bit可变波特率,关闭接收  
  30.         SCON = 0x40;
  31.         TMOD = 0x20;
  32.         TH1  = 0xFF;        // 11.0592M时57600
  33.         TR1  = 1;
  34.         TI   = 1;                                                                       
  35. }

  36. void UART(uint8_t TD)                                   // 串口发送函数
  37. {
  38.         while(!TI);
  39.         TI = 0;       
  40.         SBUF = TD;
  41. }

  42. void main()
  43. {
  44.         uint8_t mi,mj;
  45.         P3 = 0xFF;
  46.         uart_init();
  47.         for(mi=0;mi<128;mi++)
  48.         {
  49.                 IRAM_BUF[mi]=mi;
  50.         }       
  51.         while(1)
  52.         {
  53.                 if((!K0)||(!K1))
  54.                 {
  55.                         delay_ms(100);
  56.                         if(!K0)
  57.                         {                                 
  58.                                 pdr=IRAM_BUF;                        // 将数组的起始地址取出来
  59.                                 for(mi=128;mi!=0;mi--)
  60.                                 {
  61.                                         CS = 0;                         // 测试IO
  62.                                         mj = *pdr;                 // 读出数据   
  63.                                         CS = 1;
  64.                                         ++pdr;                        // 指针自加1       
  65.                                         UART(mj);
  66.                                 }
  67.                         }
  68.                         else if(!K1)
  69.                         {
  70. // 听说直接对指针赋值不合法,不过实际测试可以用也没有警告
  71.                                 por=0;
  72.                                 for(mi=0;mi<128;mi++)        // 从代码区读出128字节
  73.                                 {
  74.                                         CS = 0;
  75.                                         mj = *por;
  76.                                         CS = 1;
  77.                                         ++por;
  78.                                         UART(mj);
  79.                                 }
  80.                         }
  81.                          while((!K0)||(!K1));
  82.                 }
  83.         }
  84. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
chengzepeng
1楼-- · 2020-01-26 14:26
补充:那个时间测试包含io,加上指针自加一刚好对销掉!
sunocean
2楼-- · 2020-01-26 18:20
学习了,学了这么久才发现以前觉得51中最简单的指针上居然还有这么多门道,学无止境呀
forland
3楼-- · 2020-01-27 00:17
 精彩回答 2  元偷偷看……

一周热门 更多>