自定義型別(結構,列舉,聯合)

2021-08-22 06:06:01 字數 2876 閱讀 7032

eg:struct tag //tag結構體標籤

char name[10]; //名字

int age; //年齡

char gender[3]; //性別

}; //分號不能丟

在結構體宣告的時候,可以省略結構體標籤tag

2.結構體的成員:標量,陣列,指標,甚至其他結構體

3.結構體成員的訪問:1.結構體是通過點操作符(.)訪問的,點操作符接受兩個運算元;

struct stu

char name[20];

int age;

struct stu s; //定義結構體變數

strcpy(s.name, "zhangsan"); //使用.訪問name成員

s.age = 20; //使用.訪問age成員

2.結構體訪問得到不是結構體變數,而是乙個指向結構體的指標;

struct s

char name[20];

int age;

}s;void print(struct s* ps)

printf("name=%s age=%d\n", (*ps).name, (*ps).age);

printf("name=%s age=%d\n", ps->name, ps->age);

1. struct node

int data;

struct node next;(修改:struct node* next;)

2.typedef struct (修改:typedef struct node)

int data;

node* next; (修改:struct node* next;)

}node;

5.結構體的定義和初始化

struct point

int x;

int y;

}p1; //宣告並同時定義

struct point p2; //定義結構體變數p2

struct point p3 = ;

struct stu //型別宣告

char name[20];

int age;

struct stu s = ;//初始化

巢狀初始化

struct point

int x;

int y;

}p1; //宣告並同時定義

struct node

int data;

struct point p;

struct node* next;

}n1 = ,null };//結構體巢狀初始化

(1)對齊規則:1.第乙個成員在結構體變數偏移量為0的位置;

2.其他成員變數對齊到某個數字(對齊數)的整數倍位址處

對齊數=編譯器預設與該成員大小較小值

(vs預設為8,linux預設為4)

3.結構體總大小為最大對齊數的整數倍;

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

效能原因:未對齊的記憶體,處理器需要兩次訪問;

(3)記憶體對齊就是空間換取時間

(4)建議在設計結構體時,讓空間小的成員集中在一起

7.結構體傳參:

原因:函式傳參,引數需要壓棧,如果傳遞乙個結構體的話,結構體過大,壓棧的操作開銷比較大影響效能;

定義:位段和結構體類似,兩點區別 :1.位段成員必須是int型別(int,signed int,unsigned int)

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

eg: struct a

int _a : 3;

int _b : 5;

位段的記憶體分配:1.位段的成員可以是int unsigned int signed int char (整形家族)型別

2.位段的空間上是按照4個位元組或者乙個位元組來開闢的;

3.位段有很多不確定因素,所以不能跨平台;

位段的跨平台問題:

1.int被看作有符號還是無符號不確定;

2.位段中最大位數目不能確定,(16位最大16,32位最大32);

3.位段成員從左到右還是從右到左不清楚;

4.乙個結構兩個位段,第二個較大,無法容納第乙個,捨棄還是利用不清楚;

總結:位段與結構體相比,能夠節省空間,但最大問題就是跨平台的問題;

定義:一一枚舉出來所有可能的值;

eg:enum day

mon, //逗號

thus,

wed, //列舉常量,都有值,預設從0開始,一次遞增為1,定義時候可以賦初值;

列舉的優點:1.增加**的可讀性和可維護性;

2.和define定義的表示法相比,列舉有型別檢查,嚴謹;

3.防止命名汙染(分裝);

4.便於除錯;

5.使用方便,一次可以定義多個常量;

定義:這種型別的定義的變數包含一系列的成員,特徵是這些成員共用一塊空間

eg:union un

char c;

int i;

union un un; // 聯合變數的定義

//計算大小

printf("%d\n", sizeof(un));

特點:聯合的成員共用一塊記憶體空間,這樣乙個聯合變數的大小,至少是最大成員的大小;

大小計算:1.聯合體大小至少是最大成員大小;

2.當最大成員大小不是最大對齊數的整數倍時,就要對齊到最大對齊數的整數倍;

自定義型別 結構體 列舉 聯合

結構體 所謂結構體,就是將一大堆值放在一起,建立乙個新的型別,這些成員可以是不同型別的變數。struct tag variable list tag 要求 1.見名知意 2.可以省略 3.不建議省略 member list c語言中,不能為空 variable list 變數列表,可以省略,建議省略...

自定義型別 結構體,列舉,聯合

首先先說一下c語言的資料型別,其框架型別如圖所示 今天主要說一下結構體,列舉,聯合這三種自定義型別。1,結構體 1.1 結構體的宣告 結構體是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別得變數。1 結構體的成員 結構體的成員可以是標量,陣列,指標,甚至是其他結構體。2 結構體的宣...

自定義型別 結構體,列舉,聯合

結構體的宣告 struct tag variable list 例如描述乙個學生 struct stu 分號不能丟特殊的宣告 在宣告結構的時候,可以不完全的宣告。比如 匿名結構體型別 struct x struct a 20 p 警告 編譯器會把上面的兩個宣告當成完全不同的兩個型別。所以是非法的。結...