>后一段解释了上一篇文章数据接收发送的存储原理,结合使用效果更佳; 指针概念 指针表示一个地址。如果在软件中定义了一个变量,对变量进行编译后,系统根据变量的类型分配相应的内存空间,如一个BYTE变量,系统会为其分配1个字节的存储空间,如果是一个REAL类型变量,系统则为其分配4个字节的存储空间。 一般而言,程序都是通过变量名来对内存单元进行存储操作的。这是因为程序经过编译后,已经将变量名转换为变量的内存地址,对变量的存储其实都是通过内存地址所进行的。 例如,在程序中定义var1,var2 和var3三个变量,在声明时将其都定义为WORD类型,经过系统编译后,系统分配给var1的内存空间为两个字节,地址分别为1000和1001,var2为1002和1003,var3为1004和1005。1000和1001内存中的具体数据则是var1内的具体数据,var2和var3也是相同的道理,示意图如下图所示。此种按变量地址存储数据的方式在高级语言中也称之为“直接访问”方式。 一个是由变量名访问,一个是由地址访问 指针变量概念 一个变量的地址称为该变量的“指针”。如地址为1000和1001的变量是var1的指针。如果有一个变量专门用来存放另一个变量的地址(指针),此时,我们则称它为“指针变量”。 即指针变量不存储值,存储的是另外一个变量的地址 在软件中使用关键字“POINTER TO+类型”对指针变量进行声明。类型可以是变量、程序、功能块、方法和函数的内存地址。它可以指向上述的任何一个对象以及任意数据类型,包括用户定义数据类型。 定义指针类型变量 声明指针的语法如下: <identifier>: POINTER TO <data type>; identifier:指针标识符即指针名字。 data type:指针指向的数据类型,类型可以为22种基本数据类型 (不包括BIT)、功能块 、程序 、方法 、函数。 通过地址操作符对指针进行操作。地址操作符包括ADR(获取变量地址)和^(变量地址对应的值)。 指针类型变量的使用 取指针地址内容即意味着读取指针当前所指地址中存储的数据。通过在指针标识符后添加内容操作符“^”,可以取得指针所指地址的内容。通过下面的例子说明指针类型变量的使用。 例: 在声明中定义Point01变量为指针变量,该变量将来用于存储地址数据。 声明int变量 var1:=2 var2不赋值; 程序中使用ADR指令,该指令是用来获取变量内存地址的操作符, 执行 Point01:=ADR(var1) Point01内就已经获取了var1的内存地址信息 Point01^指的是该内存地址中对应的具体数据、即var1中2。 var2:=Point01^; 指令执行后,就将PointVar^赋值给了var2,故var2=2。 所以在上一篇文章中, //(公众号:工控修炼之路) DataStr: STRING; Buffer: POINTER TO BYTE:=ADR(DataStr); ADR(DataStr) 的作用
ADR 指令返回变量 DataStr 在内存中的起始地址,Buffer 作为指向字节的指针,直接指向该地址
- 在PLC中,字符串(
STRING 类型)在内存中以连续的字节序列存储,包含字符数据及可能的长度信息或终止符(如 \0 )。
指针操作的本质 - 通过
Buffer^ 修改字节值,相当于直接操作 DataStr 对应的内存区域。例如,若 DataStr 的初始值为 'ABC' ,其内存布局可能为
0x41 ('A') 、0x42 ('B') 、0x43 ('C') 、0x00 (终止符) 。 - 若执行
Buffer^ := 0x44 ,则 DataStr 的第一个字符变为 'D' ,即字符串变为 'DBC'
个人理解,如有错漏,欢迎留言讨论;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |