一點一點弄懂C中struct

以前大學的時候?qū)W過半個學期的C語言,除了幾個簡單的循環(huán)還記得外,其他的早就是跟飯一起吃下去了。最近看一些Objective-c稍微一些底層東西的,發(fā)現(xiàn)其中出現(xiàn)太多了struct,我們知道的oc 所有的類都是結(jié)構(gòu)體钾麸,這也就是為什么底層的時候會出現(xiàn)很多結(jié)構(gòu)體了更振,最近沒有事的時候又常常翻翻以前買的一本書《Objective-C高級編程 iOS與OS X多線程和內(nèi)存管理 》可能大家都看過的。自己再看的時候才發(fā)現(xiàn)自己是多么的淺嘗輒止饭尝,也可能因為因為自己在菜了肯腕,理解不了所以才看那的膚淺,再看Block這一章的時候钥平,發(fā)現(xiàn)通過編譯后分析生成的都是結(jié)構(gòu)體实撒,于是才想回過頭來再學學struct,讓自己看起來不再那么吃力。(注:看這篇文章還是要有一點C基礎(chǔ)的)
我們先來看看在C 語言中如何一個聲明一個結(jié)構(gòu)體類型"

struct  struct_name {
 xxx  x1,
 xxx  x2,
 ... ...
}

這樣子我們就是聲明一個結(jié)構(gòu)體涉瘾,結(jié)構(gòu)體是什么的知态,結(jié)構(gòu)體就是C語言中的一種復雜數(shù)據(jù)類型,就是就 int float 一樣立叛。我們先來定一個最簡單結(jié)構(gòu)體point 點吧负敏,一個pont 應該是由 x,y 坐標決定的

struct Point  {
    float x; // x 坐標
    float y;  // y 坐標
} ;

那怎么如何聲明一個我們定義的Point 類型結(jié)構(gòu)體量呢,也很簡單:

struct Point point; // 這樣子我們就聲明了一個結(jié)構(gòu)體變量這樣子
還有一種聲明方式也很常見就是直接跟定義的后面
struct Point {
    float x;
    float y;
} point;

那怎么初始化呢秘蛇,一種我們可以在聲明時候用{}進行初始化

struct Point point = {3.0,4.0}; // 這樣子初化一個點坐標為(3.0,4.0)
也可以這樣子
struct Point point;
point.x = 3;
point.y = 4;
還可以這樣子
struct Point point = {.x = 3.0,.y = 4.0};

這是有名字的結(jié)構(gòu)體當然你還可以定義匿名的結(jié)構(gòu)體顧名思義匿名結(jié)構(gòu)體就是沒有名字我先來聲明一個匿名結(jié)構(gòu)體看看

struct  {
    float x;
    float y;
};
注意“ 如果我們這樣子定義一個結(jié)構(gòu)體原在,結(jié)構(gòu)沒有名字那我們就沒有辦法用來用來聲明變量了,
所以一般匿名的結(jié)構(gòu)體再定義的時候我們就會在后面聲明一個變量如
struct  {
    float x;
    float y;
} point;// 當然初化上面的初始沒有差別但是要注意不同的類型的匿名結(jié)構(gòu)體變量他們的類型是不同的 如:
struct  {
    float x;
    float y;
} point1;
struct  {
    float x;
    float y;
} point2;
注意 :point1 和 point2 他們的類型是不同的

所以一般匿名結(jié)構(gòu)體彤叉,一般只用來生成一個變量。還有一個用途下面再說的村怪,我回過頭來再看看聲明每次都要用

struct Point point; 

用我們面向?qū)ο笏枷雭砜?Point point 這樣子看起來也簡潔點秽浇,當然c語言中也提供些便利我們看看怎么做,沒有錯你能已經(jīng)想到了甚负,別名typedef 我還用我們上面的點的來舉例 Point 我這次來給Point 起個別名叫CGPoint我們來看看怎做

typedef struct Point  {
    float x;
    float y;
} CGPoint; // 這樣子我就給 struct Point 起了一個別名叫CGPoint
那我們就可以使用 CGPoint point 來聲明一個點了
CGPoint point 與 struct Point point 是完全等價的柬焕。

我們再來看上面的struct 既然我們可以直接使用了 CGPoint 那我們再給它起個起個名字好像顯得有點多余了,那我們是不是可以省略這個名字呢梭域,你是不是已經(jīng)想到了落匿名的 struct 那我們?nèi)サ裘挚纯矗?/p>

typedef struct  {
    float x;
    float y;
} CGPoint;

CGPoint point;是不是簡潔了許多斑举,到這里你是不是發(fā)現(xiàn)了什么了,CGPoint 是不是用到過病涨,那你有沒有看看它到底是個什么呢富玷,是時候在項目中看一下了,按住 Command 點擊一下看看

1.1.png

看明白了嗎既穆,先定義一個名CGPoint 結(jié)構(gòu)體赎懦,又給CGPoint 起了個別名CGPoint 到了這里你不是對結(jié)構(gòu)體有一點了解呢,當然這是簡單的結(jié)構(gòu)體幻工。還有更復雜一點的結(jié)構(gòu)體励两,結(jié)構(gòu)體中引用結(jié)構(gòu)體,結(jié)構(gòu)體中引用指針等我們來看看結(jié)構(gòu)體引用結(jié)構(gòu)體囊颅?

typedef struct Rect {
     struct Point {
        float x;
        float y;
    } origin;
    
    struct size {
        float width;
        float height;
    } size;
} CGRect;

但是結(jié)構(gòu)體中不能引用自身結(jié)構(gòu)體当悔,像這樣子是不行的

typedef struct Rect {
    struct Rect frame;
} CGRect;

傅瞻,因為struct 定義的時候必需知道數(shù)據(jù)大小,Rect 需要知道frame數(shù)據(jù)大小盲憎,frame 大小又取決的Rect大小好像死鎖了嗅骄,但是我們可以在struct定義指向自身的指針,像這樣子又是可以的

typedef struct Rect {
    struct Rect *frame;
} CGRect;

上面就是一些簡單的stuct說明焙畔,注意C 中的struct與C++中的struct 是不同的的掸读,C 中struct 不能函數(shù),但可以函數(shù)指針宏多,繼承什么的就更不用說了儿惫,這里沒有說指針,因為指針要說的多了伸但,注意struct訪問普通成員struct 用點語法肾请,訪問指針成員要用->。 另外struct 存在字節(jié)對齊的更胖,成員聲明順序也可能會影響struct 實際占用內(nèi)存的大小,這些知識又相對深一些了铛铁,這里就不多說有興趣可以google 一下學習。本文只是簡單說明怎么聲明一個struct,及初始化的方法是一些比較淺顯的知識却妨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饵逐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彪标,更是在濱河造成了極大的恐慌倍权,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捞烟,死亡現(xiàn)場離奇詭異薄声,居然都是意外死亡,警方通過查閱死者的電腦和手機题画,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門默辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苍息,你說我怎么就攤上這事缩幸。” “怎么了竞思?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵桌粉,是天一觀的道長。 經(jīng)常有香客問我衙四,道長铃肯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任传蹈,我火速辦了婚禮押逼,結(jié)果婚禮上步藕,老公的妹妹穿的比我還像新娘。我一直安慰自己挑格,他們只是感情好咙冗,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漂彤,像睡著了一般雾消。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挫望,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天立润,我揣著相機與錄音,去河邊找鬼媳板。 笑死桑腮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蛉幸。 我是一名探鬼主播破讨,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奕纫!你這毒婦竟也來了提陶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤匹层,失蹤者是張志新(化名)和其女友劉穎隙笆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體又固,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年煤率,在試婚紗的時候發(fā)現(xiàn)自己被綠了仰冠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝶糯,死狀恐怖洋只,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昼捍,我是刑警寧澤识虚,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站妒茬,受9級特大地震影響担锤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乍钻,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一肛循、第九天 我趴在偏房一處隱蔽的房頂上張望铭腕。 院中可真熱鬧,春花似錦多糠、人聲如沸累舷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽被盈。三九已至,卻和暖如春搭伤,著一層夾襖步出監(jiān)牢的瞬間只怎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工闷畸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尝盼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓佑菩,卻偏偏與公主長得像盾沫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子殿漠,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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