打印
[51单片机]

51架构单片机指针详解

[复制链接]
323|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
87cc|  楼主 | 2021-3-1 09:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 87cc 于 2021-3-1 09:15 编辑

#申请原创#
指针是C语言的灵魂,更是控制单片机的利器,今天,一起来看一下指针的真面目;
1.指针也是变量:
   时刻记住,指针也是变量类型的一种,和 int  char float一样,创建指针后,会在内存空间(RAM或data区)中分配空间。对于51架构的单片机,指针占3字节空间。
   2.指针内部结构详解:
   上文说到,指针占3字节空间;那么具体为:第一字节表示区域类型,第二、三字节表示实际的起始地址。下面举例说明;
  定义 char* string1={"012345\n"};
  通过查看.M文件,D:0014H         PUBLIC        string1。可以看出,string1这个指针变量被定义为char型的指针,编译器为其分配的内存起始地址为 0x0014。接下来,我们直接定位到该地址

可以看到,0x14处的3个字节数值分别为,0xff,0x06,0xff.其中第一字节表示所在区域,本例中 ,{"012345/n"}被定义在CODE段中(代码区),所以0xff表示code区。2、3字节为2个字节16进制数0x06ff,表示我们定义字符串的起始地址,定位到该处

可以看到 在Code区,0x06ff开始的8个字节中,正是我们存储的{"012345\n"}。
接下来我们定义如下:
char* q;
char aaa[12]={"01234\n\r"};
q=aaa;
我们打开.M文件 D:0017H         PUBLIC        q
说明q这个指针变量被分配的地址为0x0017,我们定位之:

此时,第一字节为0x00.二三字节为0x0008.由于,q内存的是变量aaa的地址,所以第一字节0x00此时表示data区(RAM),我们定位到此时的地址:

可以看到,data区0x0008开始的8个字节,存放了我们定义的char aaa[12]={"01234\n\r"};
最后,我们定义如下:
char* q;
char xdata aaa[12]={"01234\n\r"};
q=aaa;
打开.M文件查看q D:000BH         PUBLIC        q
定位

注意 第一字节数值为0x01,由于我们char xdata aaa[12]={"01234\n\r"};定义在外部区域,所以此时0x01表示指针指向外部数据存储区(xdata),再次定位

我们可以看到 在外部存储区的0x0000开始的8个字节,使我们定义的数值char xdata aaa[12]={"01234\n\r"};
至此,我们可以看出,指针变量其实也是变量的一种,只不过它存储的是变量或者常量的地址。

使用特权

评论回复
评论
21小跑堂 2021-3-1 17:29 回复TA
感谢参与原创奖励活动,此篇内容经审核与其他网站已发布的文章重合度较高,故没有通过审核,请多多加油哦! 

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

31

帖子

0

粉丝