Skip to content

指针运算


对地址值进行数学运算。

概述

指针的加减运算

指针的自增和自减

两个指针之间的距离

概述

遍历内存、从一个地址移动到另一个地址通常非常有用。指针可以实现这一点。指针的类型决定了解引用指针时(使用 Operator * (Value of))获取的变量或对象的类型,同时也决定了该类型在内存中占用的字节数(即_距离_)。例如,Short 在内存中占用两(2)个字节,而 Single 需要四(4)个字节。

指针的加减运算

指针可以像数值类型一样进行加减运算。加减的结果是一个地址,指针的类型决定了距原始指针的距离。

例如,以下代码:

start GeSHi

vb
Dim p As Integer Ptr = New Integer[2]

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

end GeSHi

将分别为 p 指向的数组中的每个整数赋值 "1" 和 "2"。由于 pInteger Pointer,表达式 "*(p + 1)" 是说要对从 p 起四/八(32/64位系统上分别为 4/8)个字节处的 Integer 进行解引用;"1" 表示距离为 "1 * Integer 的大小",即四/八(32/64位系统上分别为 4/8)个字节。

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

指针的自增和自减

有时直接修改指针本身更方便,这种情况下加减复合运算符与上述方式效果相同。例如,以下代码:

start GeSHi

vb
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

end GeSHi

遍历数组直到找到值为 "0" 的元素。如果找到值为 "66" 的元素,则显示一条消息。

两个指针之间的距离

两个指针之间的距离使用 Operator - (Subtract) 获取,以值为单位(而非字节)。例如,以下代码:

start GeSHi

vb
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)个元素的差。

具体来说,如果 ab 都是类型 T 的指针,则它们之间的距离是两者之间的字节数除以 T 的字节大小,即:

`

( cast(byte ptr, a) - cast(byte ptr, b) ) / sizeof(T)

`

参见

  • Operator + (Add)
  • Operator - (Subtract)
  • Operator @ (Address of)
  • Operator * (Value of)
  • 指针运算符

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系