自定義型別知識點小結

2021-08-14 05:14:32 字數 2700 閱讀 7967

一. 結構體

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在當...