[swift学习之十五]指针练习
2016-06-02 12:23
387 查看
//------------------------// /* 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
相关文章推荐
- 关于指针的一些事情
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- C# Pointer指针应用实例简述
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅谈c/c++中使用指针需要注意的问题
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法