数据类型:POINTER TO
指针在运行时存储对象的内存地址,例如变量或功能块实例。
指针声明的语法:
<pointer name>: POINTER TO <data type> | <data unit type> | <function block name> ;
FUNCTION_BLOCK FB_Point VAR piNumber: POINTER TO INT; iNumber1: INT := 5; iNumber2: INT; END_VAR piNumber := ADR(iNumber1); // piNumber is assigned to address of iNumber1 iNumber2 := piNumber^; // value 5 of iNumber1 is assigned to variable iNumber2 by dereferencing of pointer piNumber
取消引用指针意味着获取指针指向的值。通过附加内容运算符来取消引用指针 ^
指向指针标识符(例如:, piNumber^
在上面的例子中)。要将对象的地址分配给指针,地址运算符 ADR
应用于对象: ADR(iNumber1)
.
在联机模式下,您可以使用 去参考 从指针跳转到被引用变量的声明位置。
重要
当指针指向 I/O 输入时,应用写访问。生成代码时,这会导致编译器警告 “<指针名称>”不是有效的分配目标.例子: pwInput := ADR(wInput);
如果您需要这种构造,则必须首先复制输入值(wInput
) 到具有写访问权限的变量。
对指针的索引访问
CODESYS 允许索引访问 []
类型变量 POINTER TO
,以及数据类型 STRING
或者 WSTRING
.
指针指向的数据也可以通过附加括号运算符来访问 []
指向指针标识符(例如, piData[i]
)。指针的基本数据类型决定了索引组件的数据类型和大小。在这种情况下,对指针的索引访问是通过添加与索引相关的偏移量来算术完成的 i * SIZEOF(<base type>)
到指针的地址。指针同时被隐式取消引用。
计算:
piData[i] := (piData + i * SIZEOF(INT))^;
那不是 不是:
piData[i] != (piData + i)^;
索引访问 STRING
当您将索引访问与类型的变量一起使用时 STRING
,您将在索引表达式的偏移量处获得字符。结果是类型 BYTE
.例如, sData[i]
返回字符串的第 i 个字符 sData
作为 SINT
(ASCII)。
索引访问 WSTRING
当您将索引访问与类型的变量一起使用时 WSTRING
,您将在索引表达式的偏移量处获得字符。结果是类型 WORD
.例如, wsData[i]
将字符串的第 i 个字符返回为 INT
(统一码)。
提示
指向的引用和指针 BIT
变量是 无效 声明,以及具有基本类型的数组元素 BIT
。
减法指针
两个指针不同的结果是一个类型的值 DWORD
,即使在 64 位平台上,当指针是 64 位指针时也是如此。
提示
使用引用提供了保证类型安全的优势。指针不是这种情况。
提示
可以在运行时通过隐式监控功能检查指针的内存访问 CheckPointer
.