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。接下来,我们直接定位到该地址

51hei截图_20210119144754.png (17.8 KB, 下载次数: 85)

下载附件

2021-1-19 15:30 上传

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

51hei截图_20210119145659.png (24.89 KB, 下载次数: 103)

下载附件

2021-1-19 15:31 上传

可以看到 在Code区,0x06ff开始的8个字节中,正是我们存储的{"012345\n"}。

接下来我们定义如下:

char* q;

char aaa[12]={"01234\n\r"};

q=aaa;

我们打开.M文件 D:0017H PUBLIC q

说明q这个指针变量被分配的地址为0x0017,我们定位之:

51hei截图_20210119150332.png (21.08 KB, 下载次数: 99)

下载附件

2021-1-19 15:31 上传

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

51hei截图_20210119150639.png (20.75 KB, 下载次数: 93)

下载附件

2021-1-19 15:32 上传

可以看到,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

定位

51hei截图_20210119151112.png (19.93 KB, 下载次数: 102)

下载附件

2021-1-19 15:32 上传

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

51hei截图_20210119151329.png (17.61 KB, 下载次数: 87)

下载附件

6

2021-1-19 15:28 上传

我们可以看到 在外部存储区的0x0000开始的8个字节,使我们定义的数值char xdata aaa[12]={"01234\n\r"};

至此,我们可以看出,指针变量其实也是变量的一种,只不过它存储的是变量或者常量的地址。


冰壶怎么做的(做冰壶的方法)
什么是镜像?你真的懂镜像吗?