一把梭系列 ~ C語言範例 (0021) [結構(struct)]
一把梭系列 ~ C語言範例 (0021) [結構(struct)]
資料來源: https://openhome.cc/Gossip/CGossip/StructABC.html
線上執行: https://www.tutorialspoint.com/compile_c_online.php
★前言:
★主題:
有些資料會有相關性,相關聯的資料組織在一起,對於資料本身的可用性或者是程式碼的可讀性,都會有所幫助,例如,在程式中你可能發現,在進行帳戶之類的處理時,帳號、名稱、餘額這三個資料總是一併出現的,這時可以將它們組織在一起,定義為結構
struct Account { char id[15]; char name[20]; double balance; };
存取實例的值域時可以使用 dot 運算子「.」,將結構實例直接指定給另一結構時會進行複製,如果值域是個陣列,會逐一複製元素,如上作為引數傳遞時也是如此
struct Account acct; acct.id = "123-456-789"; acct.name = "Justin Lin"; acct.balance = 1000;
如同變數沒有指定初值,結果會不可預期,如果沒有指定值域的初值也是如此,可以如下指定每個值域的初值來建立結構實例:
struct Account acct = {"123-456-789", "Justin Lin", 1000};
在建立實例並初始化時,也可以使用成員名稱,不一定要按照成員名稱的定義順序來指定:
struct Account acct = {.balance = 1000, .id = "123-456-789", .name = "Justin Lin"};
結構的名稱型態包含 struct 這個名稱,因此建立實例時,會需要是 struct Account acct 的形式,為了方便起見,可以使用 typedef 定義結構的別名,如此一來,宣告並產生實例時,就不用再寫 struct 關鍵字
typedef struct Account01 { char id[15]; char name[20]; double balance; } Account02; Account02 accts[] = { {"123-456-789", "Justin Lin", 1000}, {"789-654-321", "Monica Huang", 1000} };
★code
#include <stdio.h> #include <stdlib.h> struct Account { char id[15]; char name[20]; double balance; }; typedef struct Account01 { char id[15]; char name[20]; double balance; } Account02; void printAcct(Account02 *acct,int intsize); int main() { struct Account acct01 = {"123-456-789", "Justin Lin", 1000}; struct Account acct02 = {.balance = 1000, .id = "123-456-789", .name = "Lin Justin"}; printAcct((Account02 *) &acct01,1); printAcct((Account02 *) &acct02,1); Account02 accts03[] = { {"123-456-789", "Justin Lin", 1000}, {"789-654-321", "Monica Huang", 1000}, }; printAcct(accts03,(sizeof(accts03)/sizeof(Account02))); return 0; } void printAcct(Account02 *acct,int intsize) { int i=0; for(i=0;i<intsize;i++) { printf("Account(%s, %s, %.2f)\n", acct[i].id, acct[i].name, (acct+i)->balance); } }
★結果:
★延伸說明/重點回顧:
01.使用結構可以將相關聯的資料組織在一起,變成一個新的資料型態(複合資料型態)
02.結構在實例存取的值域時可以使用 dot 運算子「.」
03.結構在指標存取的值域時可以使用「->」運算子