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