Pointer Arithmetic
 
以数学方式处理地址值。

概观
从指针中添加和减去
指针递增递减
两个指针之间的距离

概观


通过内存,从一个地址到另一个地址往往是有用的。指针用于完成此操作。当指针的类型确定在指针被取消引用时检索到的变量或对象的类型(使用操作符 * (Value Of)),它还确定distance (以字节为单位),其特定类型占用内存。例如,Short在内存中占用两(2)个字节,而Single需要四(4)个字节。

从指针中添加和减去


指针可以被添加到和从数字类型中减去。该加法或减法的结果是一个地址,指针的类型决定了与原始指针的距离。

例如,以下,

Dim p As Integer Ptr = New Integer[2]

*p = 1
*(p + 1) = 2

将为p 的数组指针中的每个整数赋值值“1”和“2”。由于p Integer Pointer,因此表达式“*(p + 1)”表示从p 取消引用Integer四(4)个字节; “1”表示距离“1 * the size of an Integer”或四(4)个字节。

减法遵循完全相同的原则。请记住,a - b = a + - b .

指针递增递减


有时修改指针本身更方便,在这种情况下,组合加法和减法运算符将像上面一样工作。例如,以下,

Dim array(5) As Short = { 32, 43, 66, 348, 112, 0 }
Dim p As Short Ptr = @array(0)

While (*p <> 0)
    If (*p = 66) Then Print "found 66"
    p += 1
Wend

遍历数组,直到找到一个值为“0”的元素。如果它找到一个值为“66”的元素,它将显示一条不错的消息。

两个指针之间的距离


使用操作符 - (Subtract)检索两个指针之间的距离,并以值而不是字节进行测量。例如,以下,

Type T As Single

Dim array(5) As T = { 32, 43, 66, 348, 112, 0 }
Dim p As T Ptr = @array(0)

While (*p <> 0)
    p += 1
Wend
Print p - @array(0)

将输出“5”,而不管T 是什么类型。这是因为array 32)的第一个元素与p 0)指向的元素之间存在五(5)个元素差异。

具体来说,如果a b 都是类型为T 的指针,则它们之间的距离是它们之间的字节数除以T 的大小(以字节为单位),或

Abs(cast(byte ptr, a) - cast(byte ptr, b)) / SizeOf(T)


参考