[Swift]结构体指针操作

C语言的指针操作

在c语言中申明一个变量并通过指针修改该变量的值

int a = 1;

int *p = &a;
*p = 2;

printf("a value is %d\\\\n",a);

a value is 2

c语言操作结构体指针操作
  • 申明一个叫User的结构体
typedef struct User{
    int ID;
    int age;
} User;
  • 申明一个结构体User变量user 设置ID值为1 age值为18
User user;
user.ID = 1;
user.age = 3;
  • 通过指针对变量user的值进行修改
//申明一个结构体指针变量userpointer指向user的地址
User *userpointer = &user;

//修改ID的值为2
int  *idPointer = (int *)userpointer;
*idPointer = 2;

//获得属性age所在指针
int *agePointer = ++ idPointer;
//修改user的age值为4
*agePointer = 4;
printf("user ID = %d, age = %d", user.ID, user.age);

user ID = 2, age = 4


Swift

Swift并不推荐对指针进行直接操作, 但仍提供了几种可以直接操作内存的指针类型,以下是c与Swift的语法对应表 ,使用Type 做类型占用

对于返回值、变量和参数,使用一下对应表

C 语法 Swift 语法
const Type * UnsafePointer<Type>
Type * UnsafeMutablePointer<Type>

对于类,使用一下语法对应

C 语法 Swift 语法
Type * const * UnsafePointer<Type>
Type * __strong * UnsafeMutablePointer<Type>
Type ** AutoreleasingUnsafeMutablePointer<Type>

在Swift中无类型的指针,原始内存可以用UnsafeRawPointer 和UnsafeMutableRawPointer来表示
如果像不完整结构体的这样的c指针的值的类型无法用Swift来表示,则用OpaquePointer来表示

更多指针相关知识详见文档

接下来,进行Swift版结构体指针操作

申明User结构体

struct User {
    var ID: Int
    var age: Int
}

申明变量,并获取变量地址, 创建一个user变量 ID初始值问为1 age初始值为3
通过指针设置ID值为2 设置age值为3

var user = User(ID: 1, age: 3)
let userPointer = withUnsafePointer(to: &user, {$0})//UnsafePointer<User>
//打印user指针的值
print(userPointer.pointee)
//User(ID: 1, age: 3)

//获取user ID的指针
let userIDPointer = unsafeBitCast(userPointer, to: UnsafeMutablePointer<Int>.self)
//设置ID的值为2
userIDPointer.pointee = 2
print(userPointer.pointee)
//User(ID: 2, age: 3)

//获取user age的指针
let agePointer = userIDPointer.advanced(by: 1)
agePointer.pointee = 4
print(userPointer.pointee)
//User(ID: 2, age: 4)

虽然c和Swift的语法差距有点大,但是原理是相同的

接下来我们看一个更复杂一点的例子

public struct Person { 
      var age: Int 
      var firstName: String 
      var lastName: String 
      var phoneNumber: PhoneNumber 
}
public struct PhoneNumber { 
      var number: String 
      var type: String 
}

创建person变量 并通过指针操作 获取对应的属性值

let phone = PhoneNumber(number: "186xxxxxxxx", type: "work")
var person = Person(age: 24, firstName: "Bing", lastName: "lin", phoneNumber: phone)
let rawPointer = withUnsafePointer(to: &person, { UnsafeRawPointer($0)})

let age = rawPointer.load(fromByteOffset: 0, as: Int.self)
let firstName = rawPointer.load(fromByteOffset: 8, as: String.self)
let lastName  = rawPointer.load(fromByteOffset: 32, as: String.self)
let phoneInfo = rawPointer.load(fromByteOffset: 56, as: PhoneNumber.self)

print("age: \\\\(age) firstName: \\\\(firstName) lastName: \\\\(lastName) , phoneNumber: \\\\(phoneInfo)")
//age: 24 firstName: Bing lastName: lin , phoneNumber: PhoneNumber(number: "186xxxxxxxx", type: "work")

到这里,我们已经学会了 通过指针获取值,通过指针设置对应的值
接下来 就可以运用这些知识发挥自己的创造力了

参考资料
结构体的内存空间分配原理
Swift 中的指针使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容