.

指针

.
.

在runtime中,指针存储对象的内存地址,例如变量或函数块实例。

指针的声明语法:

<pointer name>: POINTER TO <data type | data unit type | function block>;

.

.示例


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^)来解除指针的引用。要将对象的地址赋值给指针,需要对对象应用地址运算符ADRADR(iNumber1).

在线模式,你可以单击编辑 ➔ 浏览 ➔ 转到参考,从指针跳转到引用变量的声明位置。

提示!

当指针指向I/O输入时,应用写访问。这将导致编译器在生成代码时警告'<指针名称>' 不是有效分配目标.示例:pwInput := ADR(wInput);

如果需要这种类型的构造,则必须首先将输入值(wInput)复制到具有写访问权的变量中。

.
索引访问指针

CODESYS允许对类型POINTER TO变量以及数据类型STRINGWSTRING的索引访问[]

也可以通过在指针标识符后附加括号操作符[] 来访问指针所指向的数据(例如piData[i])。指针的基本数据类型决定了数据类型和索引组件的大小。在这种情况下,通过向指针的地址添加依赖于索引的偏移量i * SIZEOF( <base type> )来实现对指针的索引访问。指针同时被隐式地解引用。

计算:piData[i] := (piData + i * SIZEOF(INT))^; 

这是piData[i] != (piData + i)^.

索引访问STRING

当对类型为STRING的变量使用索引访问时,将在索引表达式的偏移量处获得字符。结果为BYTE类型。例如,sData[i]将字符串sData的第i个字符作为SINT(ASCII)返回。

索引访问WSTRING

当将索引访问与WSTRING类型的变量一起使用时,将在索引表达式的偏移量处获得字符。结果为WORD类型。例如,wsData[i] 将字符串的第i个字符作为INT (Unicode)返回。

.
减去指针

当指针是64位指针时,即使在64位平台上,两个指针之间的差异结果也是DWORD类型的值。

.

 

引用的使用提供了保证类型安全的好处。指针则不是这样。

 

指针的内存访问可以在runtime由隐式监视函数CheckPointer检查。