C語言之自定義型別

2021-08-17 19:46:05 字數 1983 閱讀 8917

結構體型別的建立

struct tag

stu;

struct

class;

struct

class1;

int main()

這裡編譯器會把上邊兩個宣告當作不同的型別,而且如果我們在想建立乙個相同成員的結構體class2,就必須的在main()函式前邊建立,這樣及其不方便。

struct tag

class;

int main()

有標籤時,如果還需要相同型別的結構體,在建立時就特別方便了。

struct tag

class;

//這是錯誤的

struct tag

class;

//這裡我們可以定義自身型別的結構體變數,因為指標的大小在32位機器始終為4位元組。

struct tag

stu, *p;

stu.name;

結構體的初始化

我們先定義乙個結構體

struct point

p1;struct point p2 = ; //定義變數的同時賦初值

結構體的記憶體對齊

結構體的對齊原則

1. 第乙個成員在與結構體變數偏移量為0的位址處。

2. 其他成員變數要對齊到對齊數的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。vs中預設為8,linux中預設為4。(修改編譯器的對齊數(#pragma pack(1))這裡的數字如果大於編譯器的預設值,則對齊數預設為編譯器的對齊數)

3. 結構體的總大小為最大對齊數的整數陪。(每個成員除了第乙個變數都有對齊數)

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍。(結構體的對齊數就是結構體的最大對齊數)

為什麼存在記憶體對齊

位段位段的宣告和結構體類似,有兩點不同:

1. 位段的成員必須是int、unsigned int或signed int

2. 位段的成員名後邊有乙個冒號和乙個數字。

struct a

;//裡邊都是int型,佔8位元組記憶體

struct a

;//這個佔16位元組,開始的時候我以為佔12位元組

特別注意:

c99規定int、unsigned int和bool可以作為位域型別,但編譯器幾乎都對此作了擴充套件,允許其它型別的存在

使用位域的主要目的是壓縮儲存,其大致規則為:

和結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台問題存在。

列舉

enum

;

enum為關鍵字,裡邊的成員都為列舉常量,這些常量預設從0開始,依次遞增1。也可以賦初值。

enum

;

列舉的好處:

聯合(共用體)

聯合也是一種自定義型別,這種型別定義的變數包含一些列成員,這些成員共用一塊空間。

union un

在union中所有的資料成員共用一塊空間,同一時刻只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。

判斷計算機大端小端

int checksystem()

c; c.i = 1;

return (c.ch ==1);

//如果是大端返回0,小端返回1

}

C語言之自定義型別指標

對於自定義型別,我舉個字串拷貝為例子。define crt secure no warnings include include intmain int argc,char ar 我們需要用 strcpy 函式來進行拷貝,以下是錯誤的 name buf 那麼有的人會這樣考慮,如果是這樣呢?name ...

c語言 自定義型別

struct stu 分號不能丟 匿名結構體型別 struct x struct a 20 p p x 非法的操作,上面倆種完全是不同的宣告 struct node 結構體的自引用 struct node n1 null 直接初始化 struct node n2 null 結構體巢狀初始化 先來看下...

C語言自定義型別

在學習c語言的時候,它有很多的自定義型別,例如 結構體,列舉,聯合。這些型別在我們的日常使用的時候,或多或少的都會遇見到,下面就系統的介紹一下這幾種型別。一.結構體 1.結構體型別的宣告 通俗點來說,結構就是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別的成員變數。如下所示 str...