为什么 let 声明的结构可以更改



在下面的代码中,'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

如果是指针,则无法更改它指向的内存地址,但可以更改存储在该内存地址的数据。指针仅存储对内存地址的引用,因此只要该地址是常量,指针就不会更改其值。

相关内容

  • 没有找到相关文章

最新更新