搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2012-9-24 00:27:56 | 显示全部楼层 |阅读模式
本帖最后由 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. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-9-24 04:47:23 | 显示全部楼层
补充:那个时间测试包含io,加上指针自加一刚好对销掉!

出0入0汤圆

发表于 2012-9-24 09:25:01 | 显示全部楼层
学习了,学了这么久才发现以前觉得51中最简单的指针上居然还有这么多门道,学无止境呀

出0入0汤圆

发表于 2013-10-18 14:13:28 | 显示全部楼层
有些代码里uchar xdata *data  pstr,也可以使用不理解
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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