一. 結構體
1. 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。
2.結構的宣告:
這裡的tag指的是結構體的名稱,原則上可以省略,但一般不建議省略。
舉個例子,這裡我們定義乙個關於學生基本資訊的結構體:
3.結構體成員:
結構體的成員可以是標量,陣列,指標,甚至是其他結構體。這裡的標量指的是int , char , float , double等已經定義的型別。
4.結構體成員的訪問
結構體成員的訪問有兩種方法:
(1)通過點操作符(.)訪問。
(2)通過指向乙個結構體的指標(->)訪問。
繼續沿用上面的例子:
上面這個例子是利用點操作符來進行結構體成員的訪問的。
上面這個例子是利用指向結構體的指標來進行結構體成員的訪問的。
5.結構體的自引用
結構體內禁止定義自身結構體變數,可以引用指標來解決這個問題。
舉個例子:
6.結構體的不完整宣告
這種做法是不可行的。
解決方案:
7. 結構體變數的定義和初始化
結構體初始化的方式和陣列的初始化方式是一樣的。
繼續沿用之前的例子:
8.結構體內存對齊
(1)為什麼存在記憶體對齊?
1.平台原因
不是所有的硬體平台都能訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2.效能原因
資料結構尤其是棧應盡可能在自然邊界上對齊。原因是為了訪問未對其的記憶體,處理器需要用兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
(2)結構體的對齊規則:
1.第乙個成員在與結構體變數偏移量為0的位址處。也就是說,第乙個元素預設已對齊。但是需要注意的是,第乙個成員也是有對齊數的。
2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。vs預設的值8,linux中的預設值為4。
3.結構體總大小為最大對齊數的整數倍。
4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍。
總體來說,結構體的記憶體對齊是拿空間來換取時間的做法。
二. 位段
位段的宣告和結構體類似,有兩個不同:
1.位段的成員必須是int , unsigned int 或 signed int 。
2.位段的成員名後面有乙個冒號和乙個數字。
舉個例子:
a就是乙個位段型別。
那麼位段a的大小是多少?
冒號後面的數字指的是位元位的位數。
所以位段a的大小,即sizeof(struct a)=8
對於位段,一般不考慮記憶體問題。
三. 列舉
列舉就是把可能的取值一一枚舉。
1. 列舉型別的定義
舉個例子:
中的內容就是列舉型別的可能取值,也叫列舉常量。這些可能取值都是有值的,預設從0開始,一次遞增1。
列舉常量就是整數,但是對於列舉變數的賦值不能直接賦整數,依舊要將其賦成列舉常量。
例如:列舉的優點:
1.增加**的可讀性和可維護性。
2.便於除錯。
四. 聯合
聯合的成員是共用同一塊記憶體空間的,這樣乙個聯合變數的大小,至少是最大成員的大小。
舉個例子:
這個聯合體的大小就是4,即int的大小。
聯合體也要考慮記憶體對齊的問題。當最大成員大小不是最大對齊數的整數倍時,就要對齊到最大對其數的整數倍。
比如:這個例子中,sizeof(union un1)=8; sizeof(union un2)=16。
以上就是關於自定義型別的基礎知識小結,希望對大家有幫助!
自定義型別知識點
1 結構體的宣告 在宣告結構體的,必須列出它包含是所有成員。這個列表包括每個成員的型別和名字。struct tag 結構體標籤 variable list 變數列表結構體標籤 允許為成員列表提供乙個名字,可以在後續的宣告中使用。標籤允許多個宣告使用同乙個成員列表,並且建立同一種型別的結構。這個宣告把...
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在當...