在下面的代码中,'ptr'是由let声明的结构,但它的成员变量'pointee'可以改变,为什么?
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
在这里,ptr
是常量,因此您无法为其分配新的UnsafeMutablePointer
,但可以修改它所包含的结构。简而言之,您不能将任何内容重新分配给let
实体,但可以访问和修改其属性。
指针不是结构体。
它是一种引用类型,与值类型的结构不同。
由于将指针声明为可变的,因此可以更改pointee
(内存的内容(,但不能更改引用本身。
UnsafeMutablePointer
是一个结构体,但它声明
public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {
public var pointee: Pointee { get nonmutating set }
public subscript(i: Int) -> Pointee { get nonmutating set }
}
这里的"非变异集"意味着设置属性不会变异指针变量本身的状态。
因此,即使ptr.pointee
ptr
也可以为其分配新值是一个常量,下标 setter 也是如此:
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
ptr[0] = 2
如果是指针,则无法更改它指向的内存地址,但可以更改存储在该内存地址的数据。指针仅存储对内存地址的引用,因此只要该地址是常量,指针就不会更改其值。