C基礎(chǔ)篇之結(jié)構(gòu)體的介紹與應(yīng)用(改造我們的計(jì)算器)

上篇文章姿鸿,我們介紹了函數(shù)指針的基礎(chǔ)知識(shí)榨了,并且運(yùn)用那些知識(shí)袍暴,做了一個(gè)簡(jiǎn)易的計(jì)算器些侍,今天將來(lái)看C語(yǔ)言中的另一個(gè)重要概念:結(jié)構(gòu)體-Struct,之所以要不厭其煩的復(fù)習(xí)這些基礎(chǔ)知識(shí)政模,因?yàn)椴涣私膺@些岗宣,就很難去深入的了解Objective-C中很多重要技術(shù)的內(nèi)部實(shí)現(xiàn),畢竟如果你連語(yǔ)法都看不懂的話淋样,就別提理解了耗式。

首先我們先了解一些關(guān)于結(jié)構(gòu)體的基礎(chǔ)知識(shí),然后還是以那個(gè)四則運(yùn)算計(jì)算器作為例子趁猴,看看怎樣使用這些知識(shí)刊咳。

基本定義:結(jié)構(gòu)體,通俗講就像是打包封裝儡司,把一些有共同特征(比如同屬于某一類(lèi)事物的屬性娱挨,往往是某種業(yè)務(wù)相關(guān)屬性的聚合)的變量封裝在內(nèi)部,通過(guò)一定方法訪問(wèn)修改內(nèi)部變量捕犬。

一跷坝、結(jié)構(gòu)體定義

第一種:只有結(jié)構(gòu)體定義

struct stuff{  
        char job[20];  
        int age;  
        float height;  
};  

第二種:附加該結(jié)構(gòu)體類(lèi)型的“結(jié)構(gòu)體變量”的初始化的結(jié)構(gòu)體定義

//直接帶變量名xiaoming 
struct stuff{  
        char job[20];  
        int age;  
        float height;  
}xiaoming;  

也許初期看不習(xí)慣容易困惑,其實(shí)這就相當(dāng)于:

struct stuff{  
        char job[20];  
        int age;  
        float height;  
};  
struct stuff xiaoming;  

二碉碉、結(jié)構(gòu)體變量及其內(nèi)部成員變量的定義及訪問(wèn)

首先要分清結(jié)構(gòu)體變量和結(jié)構(gòu)體內(nèi)部成員變量的概念柴钻。
就像剛才的第二種提到的,結(jié)構(gòu)體變量的聲明可以用:

struct stuff yourname;  

其成員變量的定義可以隨聲明進(jìn)行:

struct stuff xiaoming = {"manager",30,185};  

也可以考慮結(jié)構(gòu)體之間的賦值

 struct stuff faker = xiaoming;  
 打印垢粮,可見(jiàn)結(jié)構(gòu)體的每一個(gè)成員變量一模一樣 

如果不使用上邊兩種方法贴届,那么成員數(shù)組的操作會(huì)稍微麻煩(用for循環(huán)可能好點(diǎn))

xiaoming.job[0] = 'M';  
xiaoming.job[1] = 'a';  
xiaoming.age = 27;  
xiaoming.height = 185;  

結(jié)構(gòu)體成員變量的訪問(wèn)除了可以借助符號(hào)".",還可以用"->"訪問(wèn)(下邊會(huì)提)蜡吧。

三毫蚓、結(jié)構(gòu)體嵌套

結(jié)構(gòu)體嵌套其實(shí)沒(méi)有太意外的東西,只要遵循一定規(guī)律即可:

struct A{   
        struct B{  
             int c;  
        }b;  
}a;  
//使用如下方式訪問(wèn):  
a.b.c = 10;   

特別的,可以一邊定義結(jié)構(gòu)體B斩跌,一邊就使用上:

struct A{  
        struct B{  
                int c;  
        }b;  
        struct B sb;
}a;  

使用方法與測(cè)試:

        a.b.c = 11;  
        printf("%d\n",a.b.c);  
        a.sb.c = 22;  
        printf("%d\n",a.sb.c);  
結(jié)果無(wú)誤绍些。   

四、結(jié)構(gòu)體與函數(shù):

主要是傳遞副本和指針耀鸦。

//struct A定義同上  
//設(shè)立了兩個(gè)函數(shù)柬批,分別傳遞struct A結(jié)構(gòu)體和其指針(struct A*)啸澡。  
void func1(struct A a){  
        printf("%d\n",a.b.c);          //變量訪問(wèn)采用'.'
}  
void func2(struct A* a){  
        printf("%d\n",a->b.c);        //指針訪問(wèn)采用'->'的形式
}  
main(){  
        a.b.c = 112;  
        struct A * pa;  
        pa = &a;  //&是取地址符,pa相當(dāng)于是指向a所在地址的的指針氮帐。
        func1(a);  
        func2(&a);  
        func2(pa);  
}  

以上就是要介紹的基礎(chǔ)知識(shí)了嗅虏,依然不太清晰的沒(méi)關(guān)系,文章最后會(huì)給出相關(guān)的參考資料上沐。下面看下我們計(jì)算器demo中對(duì)這些知識(shí)的使用皮服。

typedef struct {
    int x;    
    int y;
    long long int(*pfunc)();             //定義函數(shù)指針
}Calculator;                            //定義結(jié)構(gòu)體Calculator
static Calculator *cal;                 //聲明全局靜態(tài)Calculator指針cal

我們將原來(lái)的輸入值inputXinputY参咙、以及函數(shù)指針都聲明為結(jié)構(gòu)體中的成員變量龄广,通過(guò)結(jié)構(gòu)體統(tǒng)一訪問(wèn)。注意這里我們不是直接使用的結(jié)構(gòu)體變量蕴侧,而是使用了一個(gè)全局靜態(tài)的結(jié)構(gòu)體指針進(jìn)行操作择同。

使用結(jié)構(gòu)體指針的時(shí)候,必須對(duì)指針進(jìn)行初始化净宵,如下:

    cal = (Calculator *)malloc(sizeof(Calculator));

由于我們將信息都裝進(jìn)了全局的結(jié)構(gòu)體中敲才,在方法聲明的時(shí)候可以省去很多不必要的參數(shù)了。
可以從下面的calculator方法中比較一下择葡。
原來(lái)的:

double calculator(long long x,long long y,FUNC func){
   double result;
   result = (*func)(x,y);
   return result;
}

現(xiàn)在的:

double calculator(){
    double result;
    result = (* cal->pfunc)(cal->x,cal->y);
    return result;
}

cal->pfunc會(huì)根據(jù)所點(diǎn)擊的操作符的不同而指向相對(duì)應(yīng)的函數(shù)紧武,通過(guò)cal->x,cal->y來(lái)取得所輸入的值。

以上就是對(duì)結(jié)構(gòu)體的介紹與簡(jiǎn)單運(yùn)用敏储,希望那些想去了解OC原理的小伙伴們不要心急阻星,從這些重要的基礎(chǔ)開(kāi)始,畢竟建高樓首先是要打好地基的虹曙。

感興趣的可以下載demo

參考文章:
C語(yǔ)言結(jié)構(gòu)體(struct)常見(jiàn)使用方法
C 結(jié)構(gòu)體小結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迫横,一起剝皮案震驚了整個(gè)濱河市番舆,隨后出現(xiàn)的幾起案子酝碳,更是在濱河造成了極大的恐慌,老刑警劉巖恨狈,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏哗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡禾怠,警方通過(guò)查閱死者的電腦和手機(jī)返奉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吗氏,“玉大人芽偏,你說(shuō)我怎么就攤上這事∠曳恚” “怎么了污尉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵膀哲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我被碗,道長(zhǎng)某宪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任锐朴,我火速辦了婚禮兴喂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焚志。我一直安慰自己衣迷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布酱酬。 她就那樣靜靜地躺著蘑险,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岳悟。 梳的紋絲不亂的頭發(fā)上佃迄,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音贵少,去河邊找鬼呵俏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滔灶,可吹牛的內(nèi)容都是我干的普碎。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼录平,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼麻车!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起斗这,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤动猬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后表箭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赁咙,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年免钻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彼水。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡极舔,死狀恐怖凤覆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拆魏,我是刑警寧澤盯桦,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布澡绩,位于F島的核電站,受9級(jí)特大地震影響俺附,放射性物質(zhì)發(fā)生泄漏肥卡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一事镣、第九天 我趴在偏房一處隱蔽的房頂上張望步鉴。 院中可真熱鬧,春花似錦璃哟、人聲如沸氛琢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阳似。三九已至,卻和暖如春铐伴,著一層夾襖步出監(jiān)牢的瞬間撮奏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工当宴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜吊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓户矢,卻偏偏與公主長(zhǎng)得像玲献,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梯浪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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