一把梭系列 ~ C語言範例 (0021) [結構(struct)]

一把梭系列 ~ 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.結構在指標存取的值域時可以使用「->」運算子
    

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *