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