上一篇結束後我們就介紹了完整的變數生命週期了,也提到了區域變數、全域變數、自動變數、靜態變數的概念,對於寫程式來說搞懂變數的作用域是很重要的事情喔!
今天我們來介紹變數的組合技--「Struct」!
到現在我們已經把單一變數的各種型態、作用域都介紹完成了,今天我們要來提到的是Struct(結構),Struct是一種自訂的資料型態,可以把不同的基本資料型態(int.float.double.char)變數組合,形成新的資料型態。
也許這樣說起來有一點籠統,不如我們來看下面的程式碼:
#include <stdio.h>
#include <string.h>
struct students{
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
};
int main()
{
struct students one;
one.id = 1;
strcpy(one.name, "張小美");
one.chinese = 77;
one.english = 83;
one.math = 86;
one.social = 68;
one.science = 91;
printf("學生編號: %d\n", one.id);
printf("姓名: %s\n", one.name);
printf("國文成績: %d\n", one.chinese);
printf("英文成績: %d\n", one.english);
printf("數學成績: %d\n", one.math);
printf("社會成績: %d\n", one.social);
printf("自然成績: %d\n", one.science);
return 0;
}
可以看到在主函式外宣告了一個名為students的struct,而這個students中包含了int.char這些資料型態的變數,又與之前我們提過的陣列,都是同資料型態的樣子大不相同。
struct比較像是為了描述某個資料而自訂出來的,而為此我們會組合許多不同變數,如同資料表中會有許多不同欄位,但都是為了描述一筆一筆的資料而生。
(1) 純粹定義struct
struct students{
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
};
日後需使用struct時的變數宣告:
struct students someone;
(2) 定義struct的同時宣告變數
struct students{
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
}someone;
日後使用時直接使用這個,已經被宣告好的變數someone就可以了。
(3) 定義struct也宣告struct別名
struct students{
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
}
typedef struct students Student;
這樣我們就替這個新struct取好Student的別名了,日後使用時的變數宣告會變為:
Student someone;
(4) 在定義struct時直接取別名
typedef struct{
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
}Student;
日後的變數宣告:
Student someone;
(延伸閱讀:李山姆的部落格-typedef struct用法說明)
(1) 變數宣告
與一般的變數宣告一樣,都是採取「資料型態 變數名稱;」的形式
(a) 無別名也未在結構宣告時同時宣告變數
struct students{
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
};
struct students someone;
(b) 已定義別名
typedef struct {
int id;
char name[20];
int chinese;
int english;
int math;
int social;
int science;
}Student;
Student someone;
(2) 取得、變更變數成員
one.id = 1;
printf("學生編號: %d\n", one.id);
#include <stdio.h>
#include <string.h>
struct staffs{
int id;
char name[20];
char gender;
int age;
char address[50];
};
int main()
{
struct staffs no1;
no1.id = 1;
strcpy(no1.name, "王小明");
no1.gender = 'm';
no1.age = 23;
strcpy(no1.address, "xx市xx區xx里xx路xx號x樓");
struct staffs no2;
no2.id = 2;
strcpy(no2.name, "葉花花");
no2.gender = 'w';
no2.age = 26;
strcpy(no2.address, "oo市oo區oo里oo路o號o樓");
printf("---列印員工資料---\n\n");
printf("員工編號: %d\n", no1.id);
printf("姓名: %s\n", no1.name);
printf("性別: ");
if(no1.gender == 'm'){
printf("男\n");
}
else if(no1.gender == 'w'){
printf("女\n");
}
else{
printf("不詳\n");
}
printf("年紀: %d\n", no1.age);
printf("地址: %s\n", no1.address);
printf("---列印員工資料---\n\n");
printf("員工編號: %d\n", no2.id);
printf("姓名: %s\n", no2.name);
printf("性別: ");
if(no2.gender == 'm'){
printf("男\n");
}
else if(no2.gender == 'w'){
printf("女\n");
}
else{
printf("不詳\n");
}
printf("年紀: %d\n", no2.age);
printf("地址: %s\n", no2.address);
return 0;
}
struct可以包含許多不同資料型態的成員。
在進行struct定義後,仍需進行變數宣告才可以使用。
在進行結構的變數宣告時,要注意資料型態是什麼、有沒有取別名。