关闭

[swift学习之十五]指针练习

标签: 指针swift
219人阅读 评论(0) 收藏 举报
分类:
//------------------------//
        /*
         1:UnsafeMutablePointer为可变的,UnsafePointer不可变的
         2:UnsafeMutablePointer其实是个struct,带泛型的。
         3:下面写法错误,不能直接获取指针,这点很重要啊,和c++的重要区别
         let a = 100
         let b = &a
         */
        /*形参*/
        func IncInt(ptr: UnsafeMutablePointer<Int>) ->Int{
            ptr.memory+=1
            return ptr.memory
        }
        /*IncIntNomal与IncInt效果等价的,肯定推荐IncIntNomal*/
        func IncIntNomal(inout ptr: Int) ->Int{
            ptr+=1
            return ptr
        }
        var intValue = 5
        IncInt(&intValue)
        IncIntNomal(&intValue)
        /*变量类型
         1:public init(bitPattern: Int)用这个方法初始化,意思是直接指明内存地址。
         2:public init()这个说是要在3.0后淘汰。
         3:对于alloc的用法也没理解清楚,说是申请类型*个数的空间,但我只alloc(1),居然也能用3个。
         4:sizeof(Character)=9,这个有些大啊,但肯定不是hashValue占空间,因为bool也有hashValue,但它们相距的地址为16字节哦~
         5:为Int类型的时候,可以不initialize,但得到的值不是0。Character必须initialize再用。
        */
        let OnePtr = UnsafeMutablePointer<Character>.alloc(1)
        let TwoPtr = OnePtr.successor()
        let ThreePtr = TwoPtr.successor()
        OnePtr.initialize("a")
        TwoPtr.initialize("b")
        ThreePtr.initialize("c")
        print("one:\(OnePtr) two:\(TwoPtr) Three:\(ThreePtr)")
        print("one:\(OnePtr.memory) two:\(TwoPtr.memory) Three:\(ThreePtr.memory)")
        print("one distanceto Three:\(OnePtr.distanceTo(ThreePtr))")
        /*数组指针
         1:数组必须是var的,否则有错误。
         2:想打印数组的地址,还不支持&arrInt写法。哎~,只能认为arrOnePtr的地址就是数组地址。
         */
        var arrInt:[Int] = [3,5,8,1,9]
        let arrPtr = UnsafeMutableBufferPointer<Int>(start: &arrInt, count: arrInt.count)
        let arrOnePtr = arrPtr.baseAddress
        print("arrInt 地址:\(arrOnePtr)")
        /*转换
         1:用nilLiteral:()初始化为nil,地址为0.和init(bitPattern: 0)效果一样。
         2:IntToPointer这样可以直接得到某个对象的指针,不知道withUnsafeMutablePointer真正存在的意义,而且还能扩展,如下:
         extension Int{
            mutating func ToPointer() -> UnsafeMutablePointer<Int> {
            func ToPointerDetail(Ptr :UnsafeMutablePointer<Int>) -> UnsafeMutablePointer<Int>{
                return Ptr
           }
            return ToPointerDetail(&self)
           }
         }
         */
        var changePtr = UnsafeMutablePointer<Int>.init(bitPattern: 0)
        func IntToPointer(pSource: UnsafeMutablePointer<Int>)->UnsafeMutablePointer<Int>{
            return pSource
        }
        withUnsafeMutablePointer(&intValue, {(ptr:UnsafeMutablePointer<Int>) -> Void in
            changePtr = ptr
        })
        changePtr.memory = 30
        print(intValue)//30
        
        let ChangePtrEx = intValue.ToPointer()
        ChangePtrEx.memory = 20
        print(intValue)//20
        /*指针间转换
         ChangePtrVoidInt,ChangePtrEx和changePtr地址一样。
        */
       let ChangePtrVoid = withUnsafeMutablePointer(&intValue, {(ptr:UnsafeMutablePointer<Int>) -> UnsafePointer<Void> in
            return unsafeBitCast(ptr, UnsafePointer<Void>.self)
        })
        let ChangePtrVoidInt = unsafeBitCast(ChangePtrVoid, UnsafeMutablePointer<Int>.self)
        ChangePtrVoidInt.memory = 10
        print(intValue)//10
参考:http://mobile.51cto.com/iphone-464250.htm
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38850次
    • 积分:1955
    • 等级:
    • 排名:千里之外
    • 原创:152篇
    • 转载:5篇
    • 译文:4篇
    • 评论:3条
    文章分类
    最新评论