在C語言中,結構體是一種比較重要的結構,因此,對所學結構體只是做一總結和整理。
C語言提供了兩種數據類型,數組和結構,今天,就簡單的整理一下結構相關的。
1.結構體的定義
必須先定義後使用:如
2.結構成員的訪問
1)直接訪問:通過點操作符(.)訪問的。
點操作符接受兩個操作數,左操作數爲結構體的名字,右操作數就是需要訪問的成員的名字
如:Stu.name 則訪問的是結構體爲Stu的成員name。
2)間接訪問:就是使用指針來訪問一個結構體的成員,前提是有一個指向結構的指針。
即使用->操作符(也叫教頭操作符),和點操作符一樣,它接受兩個操作數,不同的是它的左操作數必須是一個指向結構體的指針。
如:p->sex; p->name;
3.不完全申明
不完全申明適用於一些相互之間存在依賴或者互相引用的結構,即一個結構之中包了含另一個結構的一個或多個成員。
例如:
struct B;struct A{int_a;struct B*_pb;};struct B{int_b;struct A*_pa;};
4.結構體初始化
結構的初始化和數組的初始化很類似,如:
struct A
{
int a;
char arr[20];
double s;
};
int main()
{
struct A sa = { 10, "abcdef", 3.14 };
printf("%1f %1f", sa.a, sa.s);
}
5.結構的存儲分配
1)結構的第一個成員永遠放在0偏移處
2)從第二個成員開始,都要對齊到某個對齊數的整數倍處。(對齊數:爲結構成員自身大小和默認對齊數的較小值。 在VS--8 Linux--4)
3)結構的總大小必須是最大對齊數的整數倍。
例:在windows的狀態下:
內存對齊的原因:
1)平臺原因(移植原因)
1> 不是所有的硬件平臺都能訪問任意地址上的任意數據的;
2> 某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
2)性能原因:
1> 數據結構(尤其是棧)應該儘可能地在自然邊界上對齊。
2> 原因在於,爲了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪
6.結構實現位段,位段大小的計算
位段的申明和結構類似,但他的成員是一個或多個位的字段。
位段成員必須申明爲int,unsigned int或signed int類型。其次,在成員名的後面是一個冒號和一個整數,這個整數指定該位段的所佔用的位的數目。
下面舉例具體說明:
值得重視的是位段不跨平臺,不存在對齊