結構體類型的概念:
結構體是指包含多個單一的數據集合。
C語言中提供了結構體數據類型作爲一個集合來處理這種複雜數據,一個結構體可以將多個單一信息結合在一起作爲一個整體來使用。使用結構體時,首先要聲明需要的結構體類型,一般形式shi :
struct 結構體名{
數據類型1,結構體成員1;
數據類型2,結構體成員2;
數據類型3,結構體成員3;
......
};
結構體名相當於這個結構體的標記,它與標識符struct共同組成這個結構體的名稱。每一個結構體可以包含很多成員,每一個成員都有一個數據類型,這些成員可以被聲明爲除該結構體類型本身外的任意有效數據類型。
定義結構體變量:
聲明瞭結構體類型後,便可以使用該類型來定義結構體變量。C語言中定義結構體變量有三種形式,其實這也是聲明結構體類型的三種形式:
1.聲明結構體類型,並定義結構體變量;
2.不聲明結構體類型,直接定義結構體變量;
3.使用typedef得到簡化的結構體類型名,再定義結構體變量。
結構體的字節長度:
一般的系統中,爲了尋址的方便,數據在內存中存儲時一般以其本身數據類型的字節長度爲基本單位對齊。而結構體數據在存儲時是以其中字節長度最大的成員的字節數爲基本單位對齊的。
結構體中的成員分配的內存空間是相鄰的。結構體變量所佔得字節空間數,即結構體數據類型的字節長度,一般等於各個結構體成員的字節長度和。
所謂對齊,是指將內存以一個固定的字節數作爲最小單位分塊,分配內存時只能一塊一塊地分配。
但是當相鄰地結構體成員的字節長度長短不一時,由於內存對齊的影響,會使結構體額外佔用一些空間,從而使其內存空間大於各個結構體成員的字節長度總和。
結構體的使用:
訪問結構體成員:
使用成員操作符(.)可以訪問結構體成員。成員操作符是一個二元操作符,前面的操作符爲結構體變量,後面的操作符爲結構體成員名。標準形式如下:
結構體名.結構體成員名;
只能通過直接訪問結構體成員的方式來實現對成員的訪問。
初始化結構體變量:
使用結構體變量和其他類型變量一樣,在使用前最好對其初始化。爲結構體初始化的方法與數組初始化類似,可以使用一個數值序列依次爲結構體成員賦值。
結構體數組:
結構體數組就是以結構體類型爲數組元素的數組。
定義結構體數組:
與定義結構體變量的方式相對應,定義結構體數組的方法有三種:
1.聲明結構體類型,並定義結構體數組:
可以聲明一個結構體類型後,再使用結構體類型來定義結構體數組。
2.不聲明結構體類型,直接定義結構體數組:也可以直接定義結構體數組。
3.使用typedef:還可以先使用typedef來得到結構體類型的別名,再使用該別名來定義結構體數組。
結構體指針:
指向結構體變量的指針:定義一個指向結構體變量的指針與定義一個指向其他類型變量的指針方法基本一樣。
一般的結構體變量只能使用成員操作符來得到成員,而結構體指針則可以通過箭頭操作符來獲得成員。
指向堆空間的結構體指針:
可以定義一個結構體指針變量並將其指向從堆上分配的內存空間。
指向結構體數組元素的指針:
將一個結構體數組元素的地址賦值給一個指針變量,便可以獲得一個指向結構體數組元素的指針變量。如果用來賦值的地址是一個結構體數組的元素,便可以利用該指針變量和相對偏移量的嘴和來訪問數組中的各個結構體元素。