接上篇文章姿鸿,我們介紹了函數(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)的輸入值inputX
、inputY
参咙、以及函數(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é)