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