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

原创 2016年06月02日 12:23:46
//------------------------//
        /*
         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
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

The Swift Programming Language学习笔记(十五)——构造过程

构造过程 存储属性的初始赋值 构造器 默认属性值 自定义构造过程 参数的内部名称和外部名称 不带外部名的构造器参数 可选属性类型 构造过程中常量类型的修改 默认构造器 结构体的逐一成员构造器 值类型的...

学习Swift笔记 (十五)Swift继承的用法

一个类可以继承另一个类的方法,

VB.net学习笔记(十五)继承与多接口练习

Public MustInherit Class Contact '只能作基类且不能实例化 Private mID As Guid = Guid.NewGuid Private mNa...

[php学习十五]javaScript的基本练习5-Cookie

JavaScript的Cookie操作 function setCookie(key,value,exdays) { var d = new Date...

Swift(十五、构造过程(2)及析构过程)

Swift学习笔记(第一版),对Swift的基础知识点进行梳理总结 构造过程-析构过程

Swift中文教程(十五) 析构

在一个类的实例被释放之前,析构函数会被调用。用关键字deinit来定义析构函数,类似于初始化函数用init来定义。析构函数只适用于class类型。 1、析构过程原理 Swift 会自动释放不再...

十五 Swift3.0之 字典

/* 字典定义: 键值对 OC: NSDictionary *dict = [NSDictionary dictionaryWithObject:@"lnj" forKey:@"name"]; NSL...

苹果新的编程语言 Swift 语言进阶(十五)--协议

协议定义了适合某个特定任务或功能需要的方法、属性和其它需求的一个蓝图。协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图。       协议与java 语言中的接口定义类似,都是...

C专家编程 十五 使用指针向函数传递一个多维数组

使用上一节所描述的笨拙方法,可以解决标记数组范围这个难题。但是还存在一个问题, 就是如何在函数内部声明一个二维数组参数,这才是真正的麻烦所在。C语言没有办法表达 “这个数组的边界在不同的调用中可以变化...

C语言入门教程 (十五) 指针概念

学习Turbo C语言,如果你不能用指针编写有效、正确和灵活的程序,可以认为你没有学好C语言。指针、地址、数组及其相互关系是C语言中最有特色的部分。规范地使用指针,可以使程序达到简单明了,因此,我们不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)