Swift中也有专门的指针类型,这些都被定性为"Unsafe"(不安全的)
MemoryLayout 获取数据类型占用内存的大小
enum MemoryLayout<T> {
static var size: Int { get } // 实际占用的内存大小
static var stride: Int { get } // 分配的内存大小
static var alignment: Int { get } // 内存对齐参数
static func size(ofValue value: T) -> Int
static func stride(ofValue value: T) -> Int
static func alignment(ofValue value: T) -> Int
static func offset(of key: PartialKeyPath<T>) -> Int?
}
UnsafePointer 类似于 const Pointee*
UnsafeMutablePointer 类似于 Pointee*
UnsafeRawPointer 类似于 const void*
UnsafeMutableRawPointer 类似于 void*
var age = 10
func test1(_ ptr: UnsafeMutablePointer<Int>){
print(ptr)
ptr.pointee += 10
}
func test2(_ ptr:UnsafePointer<Int>){
print(ptr.pointee)
}
test1(&age)
print(age)
test2(&age)
func test3(_ ptr:UnsafeMutableRawPointer)
{
ptr.storeBytes(of: 50, as: Int.self)
}
func test4(_ ptr: UnsafeRawPointer){
print(ptr.load(as: Int.self))
}
test3(&age)
print(age)
test4(&age)
//获取指向某个变量的指针
var age1 = 11
var ptr1 = withUnsafeMutablePointer(to: &age1){ $0 }
print(ptr1)
var ptr2 = withUnsafePointer(to: &age1){ $0 }
print(ptr2)
ptr1.pointee = 20
print(age1) //20
var ptr3 = withUnsafeMutablePointer(to: &age1){UnsafeMutableRawPointer($0)}
var ptr4 = withUnsafePointer(to: &age1){UnsafeRawPointer($0)}
ptr3.storeBytes(of: 30, as: Int.self)
print(ptr4.load(as: Int.self))
print(age1)
print("--------")
//获得指向堆空间实例的指针
class Person{
var name = "哈哈"
}
print("Persion")
var person = Person()
var personPtr = withUnsafePointer(to: &person){ UnsafeRawPointer($0) }
print(personPtr)
var heapPtr = UnsafeRawPointer(bitPattern: personPtr.load(as: UInt.self))
print(heapPtr!)
|