您的位置:首页 > 移动开发 > Swift

[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 swift