Swift指针

Swift指针为结构体表示分为两种,一种是带有格式的,一种是不带格式的。

如:

UnsafePointer这种是带格式的,带格式的指针实现了Pointee,所以可以使用.pointee来取值;

UnsafeRawPointer这种是不带格式的 ,可以理解为一段的纯粹的二进制,要对UnsafeRawPointer这种指针取值,需要将其转化为带格式的指针。

带有mutale的为值可变指针,即可以对指针对应的值赋值,不带的mutale的为只读指针

指针初始化
注意:使用alloc初始化的指针,释放的时候都要调用deallocate来释放

方法一:


var str = "test"

let pointer = withUnsafePointer(to: &str, {

      return $0

})

得到的是一个UnsafePointer

方法二:


let pointer = UnsafeMutablePointer.allocate(capacity: 8)

得到的是一段长度为8个字节的指针UnsafeMutablePointer

如果要得到一个空指针怎么办呢?

在oc中我们通常会用:(float *)NULL来表示

swift 提供了类似的函数使用:UnsafePointer(bitPattern: 0)

方法三:

先初始化无格式指针,再将无格式指针转化为有格式指针


let rawPointer = calloc(8, MemoryLayout<UInt8>.size)!

let pointer = rawPointer.assumingMemoryBound(to: UInt32)

方法四:

使用&,只能用于函数传递,例如:


var testStr = "test"

test(&testStr)

print(testStr)

func test(_ pointer: UnsafeMutablePointer) {

      pointer.pointee = "changed"

}

指针类型变化

如果我有一个UnsafeMutablePointer<UInt8>想按照UnsafeMutablePointer<UInt32>读取怎么办?


let point = UnsafeMutablePointer<UInt8>.allocate(capacity: 8)

 let newPointer = point.withMemoryRebound(to: UInt32, capacity: 2, {

       return $0

  })

赋值和取值


        var testStr = "123456789"

        let testP = withUnsafeMutablePointer(to: &testStr, {

            return $0

        })

        print(testP.pointee)

        testP.pointee = "abcdefg"

        print(testP)

data与bytes


        let str = "aaaaaaabbbbbbbccccccc"

        var data = str.data(using: .utf8)!

        data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in

            var bytesStart = bytes

            for _ in 0..

                print(bytesStart.pointee)

                bytesStart += 1

            }

        }

UnsafeBufferPointer(类似于bytes),用法与UnsafePointer差不多,实现了Sequence


        let str = "aaaaaaabbbbbbbccccccc"

        var data = str.data(using: .utf8)!

        let pointer = UnsafeMutableBufferPointer.allocate(capacity: data.count)

        data.copyBytes(to: pointer)

        for i in 0..10

            print(pointer[i])

        }

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

相关阅读更多精彩内容

  • 参考文献 Swift结构体指针操作官方文档Swift 和 C 不得不说的故事Swift指针和托管,你看我就够了 W...
    沉静BBQ阅读 8,214评论 1 25
  • 想必已经使用Swift语言进行开发的小伙伴们都享受到了这门语言在开发过程中带来的便利,确实作为苹果官方主推的编程语...
    文兴阅读 4,297评论 3 19
  • 因为我并不是计算机专业出身,所以下面对C语言和指针的理解都来自于很久很久上过的C课程和工作以后接触的oc以及swi...
    ASAJ阅读 352评论 0 0
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,232评论 3 119

友情链接更多精彩内容