以数学方式处理地址值。
概观
从指针中添加和减去
指针递增递减
两个指针之间的距离
概观
通过内存,从一个地址到另一个地址往往是有用的。指针用于完成此操作。当指针的类型确定在指针被取消引用时检索到的变量或对象的类型(使用
操作符 * (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)
参考