C語言基礎,結構體的使用

我們都是知道,一個數(shù)組,它只能儲存相同類型的一組數(shù)據(jù),但是在生活中,這明顯是不行的,因為在軟件中有個高級詞匯叫做抽象,當我們對一個真實存在的事物進行抽象時,那么我們會將這個事物的特征等作為對象的屬性,所以當一個集合只能儲存一個數(shù)據(jù)類型的時候,明顯不能完整的儲存數(shù)據(jù),例如:我們需要儲存一個人的信息,這個人有年齡、姓名、生日等,這其中需要的數(shù)據(jù)類型就有int ,string等類型,怎么辦呢,我們這時就需要字典,咳咳!說錯了,我們需要一個結構體。

結構體的定時方式就是:

struct name{

char * name;

int age;

}

非常簡單吧,既然我們常說的數(shù)組是一種數(shù)據(jù)類型,那么和它相似的結構體是不是也是一種類型呢,答案是明確的,當我們定義好一個結構體時,我們可以看 (struct name ) 作為數(shù)據(jù)類型的名字 相當于 int等。然后我們就可以用它定義一個變量了。但是需要注意一點的是,不要以為我們用了struct就是聲明了一片內(nèi)存空間,使用struct只是告訴電腦,我的結構體名字是name,它里面有兩個類型不同的數(shù)據(jù),簡單的來說就是模具,然后我們用模具倒出很多個真實存在的物品,所以說struct聲明的結構體就是這樣,它只是徒有其表,計算機并沒有給它分配內(nèi)存空間,只有當使用它定義一個變量時,系統(tǒng)才會分配內(nèi)存空間給它。這里要注意的是結構體的內(nèi)存也是連續(xù)的。

我們知道在數(shù)據(jù)類型后面加方括號并聲明數(shù)量是進行定義數(shù)組的,它也是可以用來聲明一個數(shù)組,和正常的數(shù)組聲明方式是一致的,從這些方面來看,當我們定義一個結構體后,這個結構體就成為了一種數(shù)據(jù)類型,我們可用是它聲明數(shù)組,指針,指針變量等等。所以正確記憶結構體的方式就是我們將它作為一個可以儲存自定義數(shù)據(jù)的一個數(shù)組類型即可。

除了結構體外,在C語言中還有枚舉和共同體,就我個人看來,枚舉就是儲存了大量混定義的數(shù)組。共同體不一樣,它和結構體得到區(qū)別,在內(nèi)存分配上。如上圖所示,結構體變量聲明后它每一個內(nèi)存區(qū)域都會連續(xù)分配好,也就是說內(nèi)存的大小是結構體內(nèi)所有元素的和。而共同體占用的內(nèi)存空間只是元素最長的長度。所以我們在給其中一個元素賦值后,如果再給另一個元素賦值,那么以前的那個元素的值就會被覆蓋掉,當然,它的局限性也限制了它使用范圍,所以我們在編程中很少用到,但是到了內(nèi)存較小的單片機等設備中,共同體占用內(nèi)存小的特點,讓它在這一個領域如魚得水。

說到內(nèi)存占用,我突然記起來,實際在應用過程中,我們經(jīng)常要對軟件做優(yōu)化,而我們在C語言中,如果需要對程序做優(yōu)化,那么我們可以在結構體中用到一個概念,那就是位域。

我們可以看到使用unsigned來定義變量,在“:”后面我們加了一個數(shù)字,這就是我們所說的位域了,位域的作用就是我們在編寫代碼過程中,結構體中成員太多,所以占用的內(nèi)存太多,所以我們可以根據(jù)實際情況,將系統(tǒng)自動匹配的內(nèi)存大小減少為實際數(shù)據(jù)最大內(nèi)存的大小,簡單的說,我們?nèi)コ再I西瓜,以前不切的時候,我們就必須買一個,但是又吃不完,現(xiàn)在好了,我們有了位域,再買西瓜的時候,我們想買多少就賣多少,夠自己吃就好了。和西瓜一樣,我們不能平白無故的給一個已經(jīng)長成的西瓜在增添一塊,位域也是同樣道理,我們設置的位域不能超過數(shù)據(jù)類型的最大長度,否則就會出現(xiàn)內(nèi)存溢出。當然并不是所有數(shù)據(jù)類型都可以設置位域的,int、signed int 和 unsigned int等有限的幾種類型可以設置位域,C99中增加了_Bool型。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容