找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6403|回复: 0
打印 上一主题 下一主题
收起左侧

51架构单片机指针详解

[复制链接]
跳转到指定楼层
楼主
本帖最后由 ccc123 于 2021-1-19 15:32 编辑

指针是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"};
至此,我们可以看出,指针变量其实也是变量的一种,只不过它存储的是变量或者常量的地址。



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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