1、結構體的宣告
在宣告結構體的,必須列出它包含是所有成員。這個列表包括每個成員的型別和名字。
struct tag//結構體標籤
variable-list;//變數列表
結構體標籤:允許為成員列表提供乙個名字,可以在後續的宣告中使用。標籤允許多個宣告使用同乙個成員列表,並且建立同一種型別的結構。
這個宣告把name標籤和這個成員的列表聯絡一起。這個宣告並沒有提供變數的列表。所以它並未建立任何變數。標籤標識了一種模式,用於宣告未來的變數,但無論是標籤還是模式本身都不是變數。
struct name
;
2、結構體的初始化
1、結構的初始化方式和陣列的初始化很相似。乙個位於一對花括號內部、由逗號分隔的初始值列表可用於結構各個成員的初始化。這些值根據結構成員列表的順序寫出。如果初始列表的值不夠,剩餘的結構成員將使用預設值進行初始化。
2、如果結構體 中包含了陣列或者結構成員,其初始化方式和多維陣列初始化方式一樣。
例如:
struct point
p1;//宣告型別的同時定義變數p1
struct point p3 = ;
struct stu //型別宣告
;struct stu s = ;//初始化
struct node
n1 = ,null};//結構體巢狀初始化
3、結構體的記憶體對齊
首先得掌握結構體的對齊規則:
1、第乙個成員在與結構體變數偏移量為0的位址處。
2、其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值.
3、結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。
4、如果有巢狀結構體的情況,巢狀的結構體對齊自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
4、什麼是位段?
位段的宣告和結構是類似的,但是有兩個不同。
(1)位段的成員必須是 int、unsigned int或者signed int。
(2)位段的成員名後邊有乙個冒號和乙個整數,這個整數指定該位段所占用的位的數目。
struct a
它列印出來的數字為8
位段跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在。
5、列舉
列舉顧名思義就是一 一枚舉。
列舉常量的取值預設是從0開始的。一次遞增1,當然在定義的時候也可以賦初值。
舉個例子:
enum color
;列舉的優點:
1 、增加**的可讀性和可維護性。
2、很#define定義的識別符號⽐比較列舉有型別檢查,更更加嚴謹。
3 、防⽌止了了命名汙染(封裝)。
4 、便便於除錯。
5、 使用⽅便,一次可以定義多個常量量。
6、聯合(共用體)
聯合也是⼀一種特殊的⾃自定義型別
這種型別定義的變數量也包含⼀一系列列的成員,特徵是這些成員公⽤用同⼀一塊空間(所以聯合也叫共⽤用
體)。(1)聯合的特點:
聯合的成員是共⽤用同⼀一塊記憶體空間的,這樣⼀乙個聯合變數量的⼤大⼩小,⾄至少是最⼤大成員的⼤大⼩小
(因為聯合⾄至少得有能⼒力力儲存最⼤大的那個成員)。
例如:
union un
;union un un;
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//輸出結果是一樣的。
聯合大小的計算
(1.)聯合的大小至少是最大成員的大小。
(2.)當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
自定義型別知識點小結
一.結構體 1.結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。2.結構的宣告 這裡的tag指的是結構體的名稱,原則上可以省略,但一般不建議省略。舉個例子,這裡我們定義乙個關於學生基本資訊的結構體 3.結構體成員 結構體的成員可以是標量,陣列,指標,甚至是其他結構體。這裡...
C語言 自定義型別知識點總結
自定義型別部分知識。知識點 結構體型別建立 結構體初始化 結構體內存對齊 位段,位段計算機大小。列舉 聯合。1.結構體型別建立 struct stu 2.結構體初始化 struct student s struct student s 3.結構體內存對齊 對齊規則 3 結構體總大小為最大對齊數的整數...
android 自定義View知識點
1 我們在xml檔案引用我們的自定義view時,會呼叫自定義view的兩個引數的構造方法 2 paint常用引數 初始化畫筆 private void initpaint 3 自定義view重新整理的方法有invalidate 和postinvalidate 這兩個方法的區別invalidate在當...