Swift 獲取指針的內(nèi)存地址

前言:

Swift 是一個類型安全(type safe)的語言,編碼的過程中類型都是確定的,所以Swift 并不推薦大家直接使用指針。

但是某一些場景下,使用指針是非常便捷的。比如鏈表中的多個結(jié)點(diǎn)的Value是相同的,如果想要對結(jié)點(diǎn)標(biāo)識唯一,可以通過結(jié)點(diǎn)的next 指針獲取到對應(yīng)的內(nèi)存地址,把內(nèi)存地址當(dāng)做唯一標(biāo)識。

Swift 指針操作

獲取一個結(jié)構(gòu)體對應(yīng)的內(nèi)存地址:

let struct = xxx
var memoryPointer: Int64 = 0
withUnsafePointer(to: & struct) { ptr in
                memoryPointer = unsafeBitCast(ptr.pointee, to: Int64.self)
}

相關(guān)知識點(diǎn)

Swift 對于指針相關(guān)的操作提供了多種結(jié)構(gòu)體方便使用,常見的比如UnsafePointerUnsafeMutablePointer,他們的區(qū)分可以簡單的理解為可變與不可變。
詳細(xì)的使用以UnsafePointer 舉例:
我們可以使用UnsafePointer 類型的實(shí)例來訪問一個內(nèi)存中的特定類型,這個特定的類型就是指針的 Pointee類型。同時,Swift也支持暫時或永久的轉(zhuǎn)換UnsafePointer 中的Pointee類型。

  • 臨時訪問一個指針的內(nèi)存作為一個不同的類型:
let uint8Pointer: UnsafePointer<UInt8> = fetchEightBytes()
let length = uint8Pointer.withMemoryRebound(to: Int8.self, capacity: 8)
  • 永久的重新綁定到不同類型,首先獲取指向內(nèi)存的原始指針,然后調(diào)用原指針的bindMemory(to:capacity:)方法。
/// 注意:將`uint8Pointer`引用的內(nèi)存重新綁定到`UInt64`后,
/// 作為`UInt8`實(shí)例訪問該指針的引用內(nèi)存是不明確的。
/// var fullInteger = uint64Pointer.pointee // OK
/// var firstByte = uint8Pointer.pointee // undefined
uint64Pointer = UnsafeRawPointer(uint8Pointer).bindMemory(to: UInt64.self, capacity: 1)

此外,還有一種方法能夠讀取不同的指針類型。首先把指針轉(zhuǎn)為UnsafeRawPointer,然后通過load方法得到不同的類型:

let rawPointer = UnsafeRawPointer(uint64Pointer)
let fullInteger = rawPointer.load(as: UInt64.self)
let firstByte = rawPointer.load(as: UInt8.self)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 任何語言的底層實(shí)現(xiàn),其實(shí)都離不開指針,大部分高級語言都會將指針的操作隱匿起來,比如在Swift中我們很少會直接使用...
    BennyLoo閱讀 3,623評論 4 13
  • 指針分類: raw pointer:未指定數(shù)據(jù)類型的指針(原生指針) typed pointer:指定數(shù)據(jù)類型的指...
    BBLv閱讀 707評論 0 1
  • 原文博客地址: 淺談Swift的內(nèi)存管理[https://www.titanjun.top/%E6%B5%85%E...
    TitanCoder閱讀 2,295評論 3 11
  • 指針 Swift中也有專門的指針類型,這些都被定性為“Unsafe”(不安全的),常見的有以下4種類型: Unsa...
    codeTao閱讀 353評論 0 1
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,541評論 0 4

友情鏈接更多精彩內(nèi)容