[Swift]結(jié)構(gòu)體指針操作

C語言的指針操作

在c語言中申明一個變量并通過指針修改該變量的值

int a = 1;

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

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

a value is 2

c語言操作結(jié)構(gòu)體指針操作
  • 申明一個叫User的結(jié)構(gòu)體
typedef struct User{
    int ID;
    int age;
} User;
  • 申明一個結(jié)構(gòu)體User變量user 設(shè)置ID值為1 age值為18
User user;
user.ID = 1;
user.age = 3;
  • 通過指針對變量user的值進(jìn)行修改
//申明一個結(jié)構(gòu)體指針變量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并不推薦對指針進(jìn)行直接操作, 但仍提供了幾種可以直接操作內(nèi)存的指針類型闪幽,以下是c與Swift的語法對應(yīng)表 鲫凶,使用Type 做類型占用

對于返回值保檐、變量和參數(shù)笨觅,使用一下對應(yīng)表

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

對于類顶吮,使用一下語法對應(yīng)

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

在Swift中無類型的指針颁股,原始內(nèi)存可以用UnsafeRawPointer 和UnsafeMutableRawPointer來表示
如果像不完整結(jié)構(gòu)體的這樣的c指針的值的類型無法用Swift來表示惜索,則用OpaquePointer來表示

更多指針相關(guān)知識詳見文檔

接下來购笆,進(jìn)行Swift版結(jié)構(gòu)體指針操作

申明User結(jié)構(gòu)體

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

申明變量,并獲取變量地址, 創(chuàng)建一個user變量 ID初始值問為1 age初始值為3
通過指針設(shè)置ID值為2 設(shè)置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)
//設(shè)置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的語法差距有點(diǎn)大耘柱,但是原理是相同的

接下來我們看一個更復(fù)雜一點(diǎn)的例子

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

創(chuàng)建person變量 并通過指針操作 獲取對應(yīng)的屬性值

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")

到這里如捅,我們已經(jīng)學(xué)會了 通過指針獲取值,通過指針設(shè)置對應(yīng)的值
接下來 就可以運(yùn)用這些知識發(fā)揮自己的創(chuàng)造力了

參考資料
結(jié)構(gòu)體的內(nèi)存空間分配原理
Swift 中的指針使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末调煎,一起剝皮案震驚了整個濱河市镜遣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌士袄,老刑警劉巖悲关,帶你破解...
    沈念sama閱讀 212,657評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谎僻,死亡現(xiàn)場離奇詭異,居然都是意外死亡寓辱,警方通過查閱死者的電腦和手機(jī)艘绍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秫筏,“玉大人诱鞠,你說我怎么就攤上這事≌饩矗” “怎么了航夺?”我有些...
    開封第一講書人閱讀 158,143評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崔涂。 經(jīng)常有香客問我阳掐,道長,這世上最難降的妖魔是什么堪伍? 我笑而不...
    開封第一講書人閱讀 56,732評論 1 284
  • 正文 為了忘掉前任锚烦,我火速辦了婚禮,結(jié)果婚禮上帝雇,老公的妹妹穿的比我還像新娘涮俄。我一直安慰自己,他們只是感情好尸闸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評論 6 386
  • 文/花漫 我一把揭開白布彻亲。 她就那樣靜靜地躺著,像睡著了一般吮廉。 火紅的嫁衣襯著肌膚如雪苞尝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,036評論 1 291
  • 那天宦芦,我揣著相機(jī)與錄音宙址,去河邊找鬼。 笑死调卑,一個胖子當(dāng)著我的面吹牛抡砂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恬涧,決...
    沈念sama閱讀 39,126評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼注益,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溯捆?” 一聲冷哼從身側(cè)響起丑搔,我...
    開封第一講書人閱讀 37,868評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啤月,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煮仇,經(jīng)...
    沈念sama閱讀 44,315評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評論 2 327
  • 正文 我和宋清朗相戀三年顽冶,在試婚紗的時候發(fā)現(xiàn)自己被綠了欺抗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,773評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡强重,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贸人,到底是詐尸還是另有隱情间景,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布艺智,位于F島的核電站倘要,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏十拣。R本人自食惡果不足惜封拧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夭问。 院中可真熱鬧泽西,春花似錦、人聲如沸缰趋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秘血。三九已至味抖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灰粮,已是汗流浹背仔涩。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粘舟,地道東北人熔脂。 一個月前我還...
    沈念sama閱讀 46,584評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像蓖乘,于是被迫代替她去往敵國和親锤悄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評論 2 351

推薦閱讀更多精彩內(nèi)容