siwft指针

swift 指针

UnsafePointer,UnsafeMutablePointer ,可变和不可变指针可以相互转变,

初始化一块内存
let p1 = UnsafeMutablePointer.allocate(capacity: 0)
p1.initialize(to: 1)
// get set
p1.pointee = 2

// 相互转化
let a:Int = p1.pointee
//let pointA:UnsafeMutablePointer = &a

// UnsafeMutablePointer -> UnsafePointer
let pa = UnsafePointer.init(p1)
// get only
pa.pointee

UnsafeMutableRawPointer,原生指针类型,创建后需要通过bindMemory绑定值类型


// UnsafeMutableRawPointer
var intSize = MemoryLayout.size
var aRawP = UnsafeMutableRawPointer.allocate(byteCount: intSize, alignment: MemoryLayout.size)
// 绑定值类型
let rp = aRawP.bindMemory(to: CLongDouble.self, capacity: 1)
rp.pointee = 12.12

rp.deallocate()

UnsafeMutableBufferPointer 指向数组的指针,可以对指针遍历,移动

// 直接对指针变换操作
var b = 0
var nb = withUnsafeMutablePointer(to: &b) { (point) -> UnsafeMutablePointer in
    
    let size = MemoryLayout.size
    size.advanced(by: 1)
    // 返回该指针的指针偏移量
    let moveP = point + 1
    moveP.pointee = 2
    moveP.pointee
    
    return moveP
}
nb.pointee

// UnsafeMutableBufferPointer
var array:[Double] = [11, 22, 33, 44, 55]
let aPtr = UnsafeMutableBufferPointer.init(start: &array, count: array.count)
for item in aPtr.enumerated() {
    item.offset
    item.element
}
let newArr = aPtr.map { (v) -> Int in
    return Int(v)
}

// 获取指针对应值
aPtr.baseAddress?.advanced(by: 1).pointee
aPtr.baseAddress?.advanced(by: 2).pointee

你可能感兴趣的:(siwft指针)