Swift 获取指针的内存地址

前言:

Swift 是一个类型安全(type safe)的语言,编码的过程中类型都是确定的,所以Swift 并不推荐大家直接使用指针。

但是某一些场景下,使用指针是非常便捷的。比如链表中的多个结点的Value是相同的,如果想要对结点标识唯一,可以通过结点的next 指针获取到对应的内存地址,把内存地址当做唯一标识。

Swift 指针操作

获取一个结构体对应的内存地址:

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

相关知识点

Swift 对于指针相关的操作提供了多种结构体方便使用,常见的比如UnsafePointerUnsafeMutablePointer,他们的区分可以简单的理解为可变与不可变。
详细的使用以UnsafePointer 举例:
我们可以使用UnsafePointer 类型的实例来访问一个内存中的特定类型,这个特定的类型就是指针的 Pointee类型。同时,Swift也支持暂时或永久的转换UnsafePointer 中的Pointee类型。

  • 临时访问一个指针的内存作为一个不同的类型:
let uint8Pointer: UnsafePointer<UInt8> = fetchEightBytes()
let length = uint8Pointer.withMemoryRebound(to: Int8.self, capacity: 8)
  • 永久的重新绑定到不同类型,首先获取指向内存的原始指针,然后调用原指针的bindMemory(to:capacity:)方法。
/// 注意:将`uint8Pointer`引用的内存重新绑定到`UInt64`后,
/// 作为`UInt8`实例访问该指针的引用内存是不明确的。
/// var fullInteger = uint64Pointer.pointee // OK
/// var firstByte = uint8Pointer.pointee // undefined
uint64Pointer = UnsafeRawPointer(uint8Pointer).bindMemory(to: UInt64.self, capacity: 1)

此外,还有一种方法能够读取不同的指针类型。首先把指针转为UnsafeRawPointer,然后通过load方法得到不同的类型:

let rawPointer = UnsafeRawPointer(uint64Pointer)
let fullInteger = rawPointer.load(as: UInt64.self)
let firstByte = rawPointer.load(as: UInt8.self)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 任何语言的底层实现,其实都离不开指针,大部分高级语言都会将指针的操作隐匿起来,比如在Swift中我们很少会直接使用...
    BennyLoo阅读 8,883评论 4 13
  • 指针分类: raw pointer:未指定数据类型的指针(原生指针) typed pointer:指定数据类型的指...
    BBLv阅读 3,856评论 0 1
  • 原文博客地址: 浅谈Swift的内存管理[https://www.titanjun.top/%E6%B5%85%E...
    TitanCoder阅读 6,660评论 3 11
  • 指针 Swift中也有专门的指针类型,这些都被定性为“Unsafe”(不安全的),常见的有以下4种类型: Unsa...
    codeTao阅读 2,507评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,387评论 0 4

友情链接更多精彩内容