什么是結(jié)構(gòu)體?
簡單的來說,結(jié)構(gòu)體就是一個可以包含不同數(shù)據(jù)類型的一個結(jié)構(gòu),它是一種可以自己定義的數(shù)據(jù)類型,它的特點和數(shù)組主要有兩點不同,首先結(jié)構(gòu)體可以在一個結(jié)構(gòu)中聲明不同的數(shù)據(jù)類型,第二相同結(jié)構(gòu)的結(jié)構(gòu)體變量是可以相互賦值的,而數(shù)組是做不到的,因為數(shù)組是單一數(shù)據(jù)類型的數(shù)據(jù)集合,它本身不是數(shù)據(jù)類型(而結(jié)構(gòu)體是),數(shù)組名稱是常量指針,所以不可以做為左值進行運算,所以數(shù)組之間就不能通過數(shù)組名稱相互復(fù)制了,即使數(shù)據(jù)類型和數(shù)組大小完全相同。
定義結(jié)構(gòu)體使用struct修飾符,例如:
上面的代碼就定義了一個名為test的結(jié)構(gòu)體,它的數(shù)據(jù)類型就是test,它包含兩個成員a和b,成員a的數(shù)據(jù)類型為浮點型,成員b的數(shù)據(jù)類型為整型。
由于結(jié)構(gòu)體本身就是自定義的數(shù)據(jù)類型,定義結(jié)構(gòu)體變量的方法和定義普通變量的方法一樣。

程序代碼
test pn1;
這樣就定義了一test結(jié)構(gòu)體數(shù)據(jù)類型的結(jié)構(gòu)體變量pn1,結(jié)構(gòu)體成員的訪問通過點操作符進行,pn1.a=10 就對結(jié)構(gòu)體變量pn1的成員a進行了賦值操作。
注意:結(jié)構(gòu)體生命的時候本身不占用任何內(nèi)存空間,只有當(dāng)你用你定義的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量的時候計算機才會分配內(nèi)存。
結(jié)構(gòu)體,同樣是可以定義指針的,那么結(jié)構(gòu)體指針就叫做結(jié)構(gòu)指針。
結(jié)構(gòu)指針通過->符號來訪問成員,下面我們就以上所說的看一個完整的例子:
總之,結(jié)構(gòu)體可以描述數(shù)組不能夠清晰描述的結(jié)構(gòu),它具有數(shù)組所不具備的一些功能特性。
下面我們來看一下,結(jié)構(gòu)體變量是如何作為函數(shù)參數(shù)進行傳遞的。
void print_score(test *pn)的效率是要高過void print_score(test pn)的,因為直接內(nèi)存操作避免了棧空間開辟結(jié)構(gòu)變量空間需求,節(jié)省內(nèi)存。
下面我們再說一下,傳遞結(jié)構(gòu)引用的例子。
利用引用傳遞的好處很多,它的效率和指針相差無幾,但引用的操作方式和值傳遞幾乎一樣,種種優(yōu)勢都說明善用引用可以做到程序的易讀和易操作,它的優(yōu)勢尤其在結(jié)構(gòu)很大的時候,避免傳遞結(jié)構(gòu)變量很大的值,節(jié)省內(nèi)存,提高效率。
上面我們說明了易用引用對結(jié)構(gòu)體進行操作的優(yōu)勢,下面我們重點對比兩個例程,進一部分析關(guān)于效率的問題。
例程2的效率要遠(yuǎn)高過例程1的原因主要有以下兩處:
第一:
例程1中的
調(diào)用的時候在內(nèi)部要在棧空間開辟一個名為pn的結(jié)構(gòu)體變量,程序pn的時候又再次在棧內(nèi)存空間內(nèi)自動生成了一個臨時結(jié)構(gòu)體變量temp,在前面的教程中我們已經(jīng)說過,它是一個copy,而例程2中的:
卻沒有這一過程,不開辟任何新的內(nèi)存空間,也沒有任何臨時變量的生成。
第二:
例程1在mian()中,必須對返回的結(jié)構(gòu)體變量進行一次結(jié)構(gòu)體變量與結(jié)構(gòu)體變量直接的相互賦值操作。
而例程2中由于是通過內(nèi)存地址直接操作,所以完全沒有這一過程,提高了效率。
函數(shù)也是可以返回結(jié)構(gòu)體應(yīng)用的,例子如下:
調(diào)用get_score(a);結(jié)束并返回的時候,函數(shù)內(nèi)部沒有臨時變量的產(chǎn)生,返回直接吧全局結(jié)構(gòu)變量a的內(nèi)存地址賦予結(jié)構(gòu)引用sp
最后提一下指針的引用
定義指針的引用方法如下:
pn就是一個指向指針的引用,它也可以看做是指針別名,總之使用引用要特別注意它的特性,它的操作是和普通指針一樣的,在函數(shù)中對全局指針的引用操作要十分小心,避免破壞全局指針!