指针运算
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgPtrArithmetic
- 最后更新: 2019-07-04
对地址值进行数学运算。
概述
遍历内存、从一个地址移动到另一个地址通常非常有用。指针可以实现这一点。指针的类型决定了解引用指针时(使用 Operator * (Value of))获取的变量或对象的类型,同时也决定了该类型在内存中占用的字节数(即_距离_)。例如,Short 在内存中占用两(2)个字节,而 Single 需要四(4)个字节。
指针的加减运算
指针可以像数值类型一样进行加减运算。加减的结果是一个地址,指针的类型决定了距原始指针的距离。
例如,以下代码:
start GeSHi
Dim p As Integer Ptr = New Integer[2]
*p = 1
*(p + 1) = 2end GeSHi
将分别为 p 指向的数组中的每个整数赋值 "1" 和 "2"。由于 p 是 Integer Pointer,表达式 "*(p + 1)" 是说要对从 p 起四/八(32/64位系统上分别为 4/8)个字节处的 Integer 进行解引用;"1" 表示距离为 "1 * Integer 的大小",即四/八(32/64位系统上分别为 4/8)个字节。
减法遵循完全相同的原则。记住,a - b = a + -b。
指针的自增和自减
有时直接修改指针本身更方便,这种情况下加减复合运算符与上述方式效果相同。例如,以下代码:
start GeSHi
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
Wendend GeSHi
遍历数组直到找到值为 "0" 的元素。如果找到值为 "66" 的元素,则显示一条消息。
两个指针之间的距离
两个指针之间的距离使用 Operator - (Subtract) 获取,以值为单位(而非字节)。例如,以下代码:
start GeSHi
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)end GeSHi
无论 T 是什么类型,都会输出 "5"。这是因为 array 的第一个元素(32)和 p 指向的元素(0)之间有五(5)个元素的差。
具体来说,如果 a 和 b 都是类型 T 的指针,则它们之间的距离是两者之间的字节数除以 T 的字节大小,即:
`
( cast(byte ptr, a) - cast(byte ptr, b) ) / sizeof(T)
`
参见
Operator + (Add)Operator - (Subtract)Operator @ (Address of)Operator * (Value of)- 指针运算符
返回 目录