Swift结构体指针操作

在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 * UnsafeMutablePointer
对于类,使用一下语法对应

C 语法 Swift 语法
Type const UnsafePointer
Type __strong UnsafeMutablePointer
Type ** AutoreleasingUnsafeMutablePointer
在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指针的值
print(userPointer.pointee)
//User(ID: 1, age: 3)

//获取user ID的指针
let userIDPointer = unsafeBitCast(userPointer, to: UnsafeMutablePointer
 
  .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")
到这里,我们已经学会了 通过指针获取值,通过指针设置对应的值

接下来 就可以运用这些知识发挥自己的创造力了

时间: 2024-10-23 17:13:57

Swift结构体指针操作的相关文章

[译]Swift 结构体指针

本文讲的是[译]Swift 结构体指针, 原文地址:Struct References 原文作者:Chris Eidhof 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:Swants 校对者:ChenDongnan FlyOceanFish 结构体指针 所有的代码都可以在 gist 上获取. 最近我打算为 Swift 的最新的 keypaths 找一个好的使用场景,这篇文章介绍了我意外获得的一个使用示例.这是我刚研究出来的,但还没实际应用在生产代码上

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+   指针数组: 在一个数组中,如果它的元素全部都是指针

c语言-关于C语言结构体指针类型的强制转换(求大神详细解答)

问题描述 关于C语言结构体指针类型的强制转换(求大神详细解答) #include <iostream> #include <algorithm> using namespace std; typedef struct { string dna; int count; }DNA; DNA dna[101]; **int cmp(const void *a,const void *b) { DNA *aa = (DNA *)a; DNA *bb = (DNA *)b; return a

c-C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么

问题描述 C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么 解决方案 p 没有初始化,也就是没有分配空间.典型的指针错误,不初始化,指针指向哪里呢? 解决方案二: array *p = new array(); 解决方案三: array p;test(&p); 解决方案四: 当然,使用指针应该首先初始化一个空地址的,否则,很容易发生指针地址错误其次,看了一下你的程序设计,程序本身是定义了一个array的结构体变量,在主函数中却要申请一个指针变量p(它的类型是结构体),一系列操

调试-求大神~~ c free()结构体指针出错

问题描述 求大神~~ c free()结构体指针出错 本人菜鸟一枚,调试程序时发现下面的程序只要用free()来释放结构体指针就出错,百思不得其解,望大师指正!非常感谢啦! 注:本人用的是VC6.0.自己写的C程序,私心揣测难道是结构体指针特殊一点,或者我释放的方式不对~ 补充:C-Free 5.0上选择mingw5调试则没有问题!到底哪里有问题? #include <stdio.h> #include <stdlib.h> #include <malloc.h> st

冒泡排序-关于结构体指针问题。什么时候在指针前面加*号,什么时候不加

问题描述 关于结构体指针问题.什么时候在指针前面加*号,什么时候不加 我在做一道对结构体数组,按姓名升序进行冒泡排序的题的时候有些不理解指针什么时候加"*"什么时候不加*. 下面上我的代码. 结构体定义 typedef struct array{ int a; char b; }Array; 为结构体赋值 Stu student[5] = { {"uioyi",'m',95,58}, {"asdf",'m',88,28}, {"cvb&

c++-时间片轮转调度算法中C++结构体指针空值问题

问题描述 时间片轮转调度算法中C++结构体指针空值问题 // 时间片轮转调度算法.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include using namespace std; int ArrivalTime[100]; //进程到达时间 int ServiceTime[100]; //进程服务时间 int

关于结构体指针的问题!求教

问题描述 关于结构体指针的问题!求教 #include "stdafx.h" #include "malloc.h" typedef struct data{ int a; int b; }data,*pdata; pdata test; void Creat(pdata para,int a, int b) { para=(pdata)malloc(sizeof(data)); para->a=a; para->b=b; } int _tmain(in

struct-关于结构体指针malloc不够的问题,求教!

问题描述 关于结构体指针malloc不够的问题,求教! 定义了一个结构体类型: typedef struct _tag_str{ char * first; short second; }str ,*pstr; 然后再定义一个结构体 typedef struct _tag_str1{ pstr first; float second; }str1,*pstr1; 定义一个变量 pstr1 strr; 在对strr初始化:strr=(pstr1)malloc(sizeof(str1)), 这样其实