数据类型: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.