解析結構體和位段

  在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類型。其次,在成員名的後面是一個冒號和一個整數,這個整數指定該位段的所佔用的位的數目。
下面舉例具體說明:

值得重視的是位段不跨平臺,不存在對齊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章