自定義型別知識點

2021-09-24 02:11:28 字數 1908 閱讀 7547

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