各式各樣的資料型態 11-1 結構的基礎知識 決定新的型態 關於結構 結構資料型態可以將不同資料型態的值整合成新的型態 結構型態的宣告語法 : struct 結構型態 { 資料型態識別字 ; 資料型態識別字 ; }; 加上 struct 進行宣告
宣告結構變數 語法 : 結構型態結構變數名稱 ; 範例 : struct Car car1; 對成員進行存取 使用結構型態的成員時, 必須使用成員選擇運算子 (.) 語法 : 結構變數名稱. 成員 這是儲存 struct Car 型態的值的變數 car1
存取結構型態的成員之範例 : #include <stdio.h> /* 結構資料型態 struct Car 的宣告 */ struct Car{ int num; 宣告結構型態 double gas; }; int main(void) { struct Car car1; 宣告結構變數 } car1.num = 1234; 把值指定給成員 car1.gas = 25.5; printf(" 車牌號碼是 %d; 汽車容量是 %f \n", car1.num, car1.gas); return 0; 輸出成員的值
從鍵盤輸入成員的值之範例 : #include <stdio.h> /* 結構資料型態 struct Car 的宣告 */ struct Car{ int num; double gas; }; int main(void) { 在前面加上 & struct Car car1; printf(" 請輸入車牌號碼 \n"); scanf("%d", &car1.num); 從鍵盤輸入成員的值 printf(" 請輸入汽油容量 \n"); scanf("%lf", &car1.gas); printf(" 車牌號碼是 %d; 汽油容量是 %f \n", car1.num, car1.gas); return 0; }
11-2 結構的寫法 利用 typedef 來分割名稱 typedef 的語法 : typedef 資料型態識別字 ; 範例 : /* 結構型態 struct Car 的宣告 */ typedef struct Car{ int num; double gas; 把 typedef } Car; 加在 struct Car 型態的前面 命名為 Car 型態
結構的初始化 語法 : 結構型態結構變數名稱 = { 值, 值, }; 範例 : #include <stdio.h> /* 結構型態 struct Car 的宣告 */ typedef struct Car{ int num; double gas; }Car; 儲存至 num int main(void) 儲存至 gas { Car car1 = {1234,25.5}; printf(" 車牌號碼是 %d; 汽車容量是 %f \n", car1.num, car1.gas); return 0; }
把值指定給結構 對結構進行指定後, 就會逐一複製其成員的值, 並儲存至所指定的目的地 範例 : #include <stdio.h> /* 結構型態 struct Car 的宣告 */ typedef struct Car{ int num; double gas; }Car; int main(void) { Car car1 = {1234, 25.5}; Car car2 = {4567, 52.2}; printf("car1 的車牌號碼是 %d 汽油容量是%f \n", car1.num, car1.gas); printf("car2 的車牌號碼是 %d 汽油容量是%f \n", car2.num, car2.gas); car2 = car1; printf(" 把 car1 指定給 car2 \n"); printf("car2 的車牌號碼變成 %d 汽油容量變成%f \n", car2.num, car2.gas); return 0; } 以其他的結構來指定
11-3 結構的大小 理解結構型態的大小 結構的大小不一定是成員大小的加總 同時, 指向大型結構的指標, 通常會小於該資料型態的大小
查詢結構型態的大小之範例 : #include<stdio.h> /* 結構型態 struct Car 的宣告 */ typedef struct Car{ int num; double gas; }Car; int main(void) 查詢結構型態的大小 { printf("int 型態的大小為 %dbyte \n", sizeof(int)); printf("double 型態的大小為 %dbyte \n", sizeof(double)); printf(" 結構 structcar 型態的大小為 %dbyte \n", sizeof(car)); printf(" 指向結構 struct Car 型態的指標大小為 %dbyte \n", sizeof(car *)); return 0; } 查詢指向結構型態的指標大小
使用位元欄 (bit field) 位元欄是會影響結構大小的成員 位元欄的語法 : struct 結構型態名稱 { 資料型態識別字 : 位元數 ; 資料型態識別字 : 位元數 ; }; 範例 : typedef struct Car1{ int num; double gas; 設為 3bit 的成員 unsigned int tire : 3; unsigned int roof : 1; 設為 1bit 的成員 unsigned int color : 4; }Car1; 設為 4bit 的成員
11-4 結構的應用 把結構當做引數來用 把結構當作函數的引數來用, 各成員便會被複製並傳送 範例 :
把指向結構的指標當作引數來用 把指向結構的指標拿來當作函數的引數, 所傳送的就是位址 從指向結構的指標存取成員時, 使用成員選擇運算子 (->) 會很方便 從指向結構的指標來存取成員的語法 : 範例 : 指向結構的指標 -> 結構的成員
製作結構的陣列之範例 : #include <stdio.h> /* 結構型態 struct Car 的宣告 */ typedef struct Car{ int num; double gas; }Car; 把值儲存在三個結構的各個元素 int main(void) { Car cars[3]; 宣告結構的陣列 int i; cars[0].num = 1234; cars[0].gas = 25.5; cars[1].num = 4567; cars[1].gas = 52.2; cars[2].num = 7890; cars[2].gas = 20.5; for(i=0; i<3; i++){ printf(" 車牌號碼是 %d 汽油容量是%f \n", cars[i].num, cars[i].gas); } return 0; }
以結構建立清單之範例 : #include <stdio.h> /* 結構型態 struct Car 的宣告 */ typedef struct Car{ int num; double gas; struct Car *next; }Car; int main(void) { Car car0; Car car1; Car car2; Car *pcar; car0.num = 1234; car0.gas = 25.5; car1.num = 4567; car1.gas = 52.2; car2.num = 7890; car2.gas = 20.5; car0.next = &car1; car1.next = &car2; car2.next = NULL; 以 car2 作為結尾 for(pcar = &car0; pcar!=null; pcar = pcar->next){ printf(" 車牌號碼是 %d 汽油容量是%f \n", pcar->num, pcar->gas); } return 0; } 包含指向 struct Car 型態的指標 car0 之後是 ctr1 car1 之後是 ctr2 依照排好的順序輸出結構
11-5 共同空間 關於共同空間 共同空間型態的各成員無法同時記憶值, 全體成員只能記憶住一個值 宣告共同空間型態的語法 : union 共同空間型態名稱 { 資料型態識別字 ; 資料型態識別字 ; }; 宣告時要加上 union
使用共同空間型態之範例 : #include <stdio.h> /* 共同空間型態 union Year 的宣告 */ typedef union Year{ int ad; int gengo; }Year; 命名 宣告共同空間型態 int main(void) { Year myyear; 宣告共同空間型態的變數 int a, g; printf(" 請輸入西元年份 \n"); scanf("%d", &a); myyear.ad = a; 把值儲存至 myyear 的成員 ad 後 printf(" 西元為 %d 年 \n", myyear.ad); printf(" 民國為 %d 年 \n", myyear.gengo); } printf(" 請輸入民國年份 \n"); scanf("%d",&g); myyear.gengo = g; printf(" 民國為 %d 年 \n", myyear.gengo); printf(" 西元為 %d 年 \n", myyear.ad); return 0; 成員 gengo 也變成相同的值
11-6 列舉型態 關於列舉型態 宣告列舉型態的語法 : enum 列舉型態名稱 { 識別字 1, 識別字 2, 識別字 3, } 列舉型態是一種可以把識別字當做值來儲存的型態, 例如 : enum Week{SUN, MON, TUE, WED, THU, FRI, SAT} Week; 指定列舉型態的數值 列舉型態之所以能夠儲存識別字的值, 是因為其內部具有分開處理從 0 開始逐次加一之整數值的機制
使用列舉型態之範例 : #include <stdio.h> /* 列舉型態 enum Week 的宣告 */ typedef enum Week{SUN, MON, TUE, WED, THU, FRI, SAT} Week; int main(void) { Week w; w = SUN; 宣告列舉型態 宣告列舉型態的變數 可以儲存識別字的值 switch(w){ case SUN: printf(" 是星期天 \n"); break; case MON: printf(" 是星期一 \n"); break; case TUE: printf(" 是星期二 \n"); break; case WED: printf(" 是星期三 \n"); break; case THU: printf(" 是星期四 \n"); break; case FRI: printf(" 是星期五 \n"); break; case SAT: printf(" 是星期六 \n"); break; default: printf(" 不知道是星期幾 \n"); break; } return 0; 利用識別字的功能可使程式簡明易懂 } 命名為 Week