ITKeyword,专注技术干货聚合推荐

注册 | 登录

Swift中如何转换不同类型的Mutable指针

mydo 分享于 2016-06-07

推荐:C语言中不同类型的指针互相转换的注意点

为什么写本文? 之所以想起来写这篇文章,是因为最近的项目代码频频报出“break strict-aliasing rules”相关的warnning信息,追其原因就是因为不同类型的指针之

2019阿里云双11返场狂欢继续,
地址https://www.aliyun.com/1111/2019/home

在Swift中我们拥有强大高级逻辑抽象能力的同时,低级底层操作被刻意的限制了.但是有些情况下我们仍然想做一些在C语言中的hack工作,下面本猫就带大家看一看如何做这样的事.

hacking is happy!!! ;]

如标题所说,现在我有一个Int变量x,我想取得它的地址,然后转换为Char类型的地址,然后将改地址的内容+1,如果用C语言来表示就是:

int x = 121,*pi = &x
char *pc = (char *)pi
*pc += 1

用Swift来写有2个问题,一是你没法直接得到一个变量的指针,二是即使你可以,你也不能直接在两种不同类型的指针直接转换.

我们先来解决第一个问题,你不能这样写:

var x:Int = 121
var px = &x //error!!!

问题不在于那个&操作符,很多人可能以为Swift没有C中取地址操作符&,可实际上是有的,但是你不能将取得的地址直接再做处理.

不过有办法,我们可以用withUnsafePointer方法的变体withUnsafeMutablePointer方法来取得其地址,只不过该地址作为一个参数传到你指定的闭包中.只要能得到地址,你还有什么奢求呢?

typealias Char = Int8
var x = 121
var pChar = withUnsafeMutablePointer(&x){(p:UnsafeMutablePointer<Int>)->UnsafeMutablePointer<Char> in
    //???
}

如上代码我们只要在闭包中返回一个Char指针就可以了,怎么做呢?

这就需要借助另一个超级强大(你懂得”强大”在这里是什么意思;])的方法unsafeBitCast,该方法将一种类型的变量内容强制转换为另一种,将以上闭包的//???处替换为如下代码:

return unsafeBitCast(p, UnsafeMutablePointer<Char>.self)

好了,我们来测试一下:

这里写图片描述

注意上图的最后一行最后的数字377,x为啥从121变为377呢?这里不予解释,因为常玩汇编或C的小伙伴肯定早就了然于心鸟! ;]

推荐:C语言指针强制类型转换

概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,

在Swift中我们拥有强大高级逻辑抽象能力的同时,低级底层操作被刻意的限制了.但是有些情况下我们仍然想做一些在C语言中的hack工作,下面本猫就带大家看一看如何做这样的事. hacking is happy!!! ;

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。