Swift 指针

本贴最后更新于 2077 天前,其中的信息可能已经时移世异

总得说点什么,不能只贴代码呐

/// Swift里面也有专门的指针类型,这些都被定性为 `Unsafe`(不安全的), 常见的4种类型 /// UnsafePointer<Pointee> 类似于 const Pointee * /// UnsafeMutablePointer<Pointee> 类似于 Pointee * /// UnsafeRawPointer 类似于 const void * 指向类型不确定 /// UnsafeMutableRawPointer 类似于 void * 指向类型不确定 var age = 10 func test1(_ ptr: UnsafeMutablePointer<Int>) {// int * ptr.pointee = 20 } func test2(_ ptr: UnsafePointer<Int>) { // const int * print("test2", ptr.pointee) } func test3(_ ptr: UnsafeRawPointer) { // const void * print("test3", ptr.load(as: Int.self)) } func test4(_ ptr: UnsafeMutableRawPointer) { // void * ptr.storeBytes(of: 30, as: Int.self) } //func test3(_ num: inout Int) { // //} test1(&age) test2(&age) test3(&age) test4(&age) //test3(&age) print(age) /// 使用场景 /// OC -> BOOL * /// Swift -> UnsafeMutablePointer<ObjeCBool> var arr = NSArray(objects: 11, 22, 33, 44) arr.enumerateObjects { (element, idx, stop) in if idx == 2 { stop.pointee = true } print(idx, element) } /// 获得指向某个变量的指针 /// withUnsafePointer 跟body返回类型一样 var ptrAge1 = withUnsafePointer(to: &age){ $0 } print(ptrAge1.pointee) var ptrAge2 = withUnsafeMutablePointer(to: &age) { (pointer) -> UnsafeMutablePointer<Int> in return pointer } var ptrAge3 = withUnsafePointer(to: &age, { UnsafeRawPointer($0) }) var ptrAge4 = withUnsafeMutablePointer(to: &age, { UnsafeMutableRawPointer($0) }) ptrAge4.storeBytes(of: 40, as: Int.self) print(age) /// 获取指向堆空间的指针 class Person { var age = 0 deinit { print("Person deinit") } } var person = Person() var ptrPerson1 = withUnsafePointer(to: &person, { $0 }) //保存person对象的地址值 print(ptrPerson1.pointee.age) /// 创建指针 var mPtr = malloc(16) mPtr?.storeBytes(of: 11, as: Int.self) mPtr?.storeBytes(of: 22, toByteOffset: 8, as: Int.self) print(mPtr?.load(as: Int.self)) print(mPtr?.load(fromByteOffset: 8, as: Int.self)) free(mPtr) var allPtr = UnsafeMutableRawPointer.allocate(byteCount: 16, alignment: 1) allPtr.storeBytes(of: 11, as: Int.self) allPtr.storeBytes(of: 22, toByteOffset: 8, as: Int.self) allPtr.advanced(by: 8) //移动8个字节,返回一个新指针 allPtr.deallocate() var capPtr = UnsafeMutablePointer<Int>.allocate(capacity: 3) capPtr.initialize(to: 11) capPtr.successor().initialize(to: 22) capPtr.successor().successor().initialize(to: 33) print(capPtr.pointee) print((capPtr + 1).pointee) print((capPtr + 2).pointee) print(capPtr[0]) print(capPtr[1]) print(capPtr[2]) capPtr.deinitialize(count: 3) capPtr.deallocate() var pPtr = UnsafeMutablePointer<Person>.allocate(capacity: 3) pPtr.initialize(to: Person()) (pPtr + 1).initialize(to: Person()) (pPtr + 2).initialize(to: Person()) pPtr.deinitialize(count: 3) pPtr.deallocate()

--EOF--

  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 555 关注

相关帖子

3 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Word
    13 引用 • 41 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖 • 3 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1062 引用 • 3455 回帖 • 147 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 236 关注
  • Visio
    1 引用 • 2 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 64 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 12 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 541 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • 印象笔记
    3 引用 • 16 回帖 • 2 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    43 引用 • 44 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 740 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 688 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    187 引用 • 1021 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 727 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 3 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 759 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    694 引用 • 537 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 56 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 485 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖