[应用笔记] 单片机指针简单解析

[复制链接]
1202|12
 楼主| HuangHongLun 发表于 2020-8-25 09:54 | 显示全部楼层 |阅读模式
一、单片机指针是什么?
单片机指针是指某个变量或数据所在存储区的内存地址
二、单片机指针有什么作用?
能够有效地表示数据结构,能动态分配内存,能较方便地使用字符串,有效地使用数组。
三、单片机指针咋么表示?
数据类型  [存储器类型]  *  变量名,例如:int xdata * pi,其中*是指针运算符,pi是指针变量,*pi表示某变量或数据所在存储区地址所对应的数值。


 楼主| HuangHongLun 发表于 2020-8-25 09:55 | 显示全部楼层
四、单片机指针赋值方式
(1)、不用声明单片机指针变量的情况下赋值
int a=5;//定义变量a
int *p=&a;//表示把变量a所在内存地址(由内存器分配)存放的数据5赋给指针变量p
(2)、声明单片机指针变量的情况下赋值
int a=5;//定义变量a
int *p;//声明指针变量p
p=&a;//表示把变量a所在内存地址(由内存器分配)赋给指针变量p,作为指针变量p所在内存地址(由内存器分配)存放的数据。
value=*p;//表示把指针变量p对应变量a所在内存地址(由内存器分配)存放的数据5赋给变量value

 楼主| HuangHongLun 发表于 2020-8-25 09:57 | 显示全部楼层
五、单片机指针通俗理解
502945f446fe9e0c68.png
由上图可知:变量STR内存地址51H存放数据40H,要通过变量STRIP获取变量STR内存地址51H存放的数据40H,可使用单片机指针(某个变量或数据所在存储区的内存地址)来完成。首先让变量STRIP获取变量STR内存地址51H,表达方式为STRIP=&STR,由此可见指针(即变量STRIP)存储的数据是另一个变量(即变量STR)的内存地址),再获取变量STR内存地址51H存放的数据40H赋给某一个变量即可,表达方式为VALUE=*STRIP,也可表示为int *STRIP=&STR。
 楼主| HuangHongLun 发表于 2020-8-25 09:58 | 显示全部楼层
六、单片机指针咋么用?
(1)、用单片机指针编程点亮LED灯的单片机C语言程序
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. sbit LED = P1^0;
  4. uchar  table[] = {0,1};//定义数组
  5. uchar *pi;//声明指针变量
  6.    void main()
  7. {
  8.     while(1)
  9. {
  10.      pi = table;//把数组变量table里的第一个元素0所在内存地址(由内存器分配)赋给指针变量pi,也可这样表示:pi = &table[0],其表达意义一样。
  11.      LED = *pi;//*pi表示取指针变量pi所指内存地址(由内存器分配)对应的值(即数组table[]中的第一个元素0)赋给led,如果是要数组里面第二个元素1这一步就该写成*(pi+1)。
  12.     }                                                         
  13.   }
(2)、用单片机指针编程循环点亮8 位LED流水灯的单片机C语言程序
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar *pi;//声明指针变量
  5. uchar code table[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//定义数组
  6.   void delay(uint t)
  7. {
  8.    uchar m,n;
  9.    for(m=0;m<t;m++)
  10.     for(n=0;n<110;n++);
  11.   }
  12.   void main()
  13. {
  14.    uchar i;
  15.    while(1)
  16. {
  17.     for(i=0;i<8;i++)
  18.   {
  19.      pi = table;//把数组变量table里的第一个元素所在内存地址(由内存器分配)赋给指针变量pi,也可这样表示:pi = &table[0],其表达意义一样。
  20.      P1 = *(pi+i);//*(p+i)表示取指针变量pi所指向数组变量table内元素所在内存地址对应的值赋给P1端口,比如:把数组变量table内的第一个元素(即0xFE)所在内存地址(由内存器分配)对应的值(即table内的第一个元素0xFE)赋给P1端口。
  21.      delay(220);
  22.     }
  23.    }                                                         
  24.   }
86315f44702828e05.png

哈根达斯uz 发表于 2020-10-30 23:54 来自手机 | 显示全部楼层
再次使用scons命令生成MDK5工程,编译、烧录,我们可以看到已经探测到了AXP152,并对其各路电压进行了配置
哈根达斯uz 发表于 2020-10-30 23:56 来自手机 | 显示全部楼层
手机想复制个c语言的代码真费劲。。。还是复制出来原来的东西
哈根达斯uz 发表于 2020-10-30 23:57 来自手机 | 显示全部楼层
行啊,又发出去了。。。推荐大家不要用曲屏手机,太憋屈了。感谢楼主吧,心累。
jiangyongabc 发表于 2020-10-31 15:06 | 显示全部楼层
能把指针玩好的,才是C高手。
嵌入小菜菜 发表于 2020-11-23 15:28 | 显示全部楼层
其实单片机的C语言,主要就是指针问题,别的都好说。
duo点 发表于 2020-11-24 15:37 | 显示全部楼层
玩好指针才是大牛
xixi2017 发表于 2021-1-14 22:55 | 显示全部楼层
通过地址的 操作方式,寻址方式。
piteqiu 发表于 2021-1-15 10:29 | 显示全部楼层
这样能够有效地表示数据结构,能动态分配内存,能较方便地使用字符串,有效地使用数组。
七毛钱 发表于 2021-1-27 17:10 | 显示全部楼层
不用声明单片机指针变量的情况下赋值,声明单片机指针变量的情况下赋值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

440

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部