天天看點

深入學習C語言 結構體和聯合體

作者:嵌入式講堂

目錄

  1. 引言
  2. 結構體的定義和初始化
  3. 結構體成員的通路
  4. 結構體作為函數參數和傳回值
  5. 結構體指針
  6. 結構體的嵌套和匿名結構體
  7. 聯合體的定義和初始化
  8. 聯合體的成員通路
  9. 小結

引言

結構體和聯合體是C語言中非常重要的概念,它們可以将不同類型的資料組織在一起,友善程式的編寫和維護。本文将深入探讨C語言中的結構體和聯合體,幫助讀者更好地了解這些概念。

結構體的定義和初始化

結構體是一種自定義的資料類型,它由多個不同類型的資料成員組成。結構體的定義方式如下:

struct 結構體名 {
    資料類型 成員名1;
    資料類型 成員名2;
    // ...
};           

例如,定義一個表示學生資訊的結構體:

struct student {
    int id;
    char name[20];
    int age;
};           

結構體的初始化方式如下:

struct student s = {1, "Tom", 18};           

結構體成員的通路

結構體成員可以使用點号(.)或箭頭(->)進行通路。點号用于通路結構體變量的成員,箭頭用于通路結構體指針變量的成員。例如:

struct student s = {1, "Tom", 18};
printf("%d %s %d\n", s.id, s.name, s.age);

struct student *p = &s;
printf("%d %s %d\n", p->id, p->name, p->age);           

結構體作為函數參數和傳回值

結構體可以作為函數的參數和傳回值,這樣可以友善地傳遞和傳回多個資料。例如,定義一個列印學生資訊的函數:

void print_student(struct student s) {
    printf("%d %s %d\n", s.id, s.name, s.age);
}

struct student s = {1, "Tom", 18};
print_student(s);           
struct student get_student() {
    struct student s = {1, "Tom", 18};
    return s;
}

struct student s = get_student();           

結構體指針

結構體指針是指向結構體的指針變量,它可以存儲結構體的位址,并且可以通過結構體指針通路結構體的成員。結構體指針的定義方式如下:

struct 結構體名 *指針變量名;           

例如:

struct student s = {1, "Tom", 18};
struct student *p = &s;
printf("%d %s %d\n", p->id, p->name, p->age);           

結構體的嵌套和匿名結構體

結構體可以嵌套定義,即結構體的成員可以是另一個結構體。例如,定義一個表示教師資訊的結構體:

struct teacher {
    int id;
    char name[20];
    int age;
    struct student s;
};           

結構體也可以使用匿名結構體,即不給結構體命名,直接定義它的成員。例如:

struct {
    int x;
    int y;
} point = {1, 2};           

聯合體的定義和初始化

聯合體是一種特殊的結構體,它隻能同時存儲一個成員的值。聯合體的定義方式如下:

union 聯合體名 {
    資料類型 成員名1;
    資料類型 成員名2;
    // ...
};           

例如,定義一個表示顔色的聯合體:

union color {
    int value;
    struct {
        unsigned char r;
        unsigned char g;
        unsigned char b;
    } rgb;
};           

聯合體的初始化方式如下:

union color c = {0xff0000};           

聯合體的成員通路

聯合體成員的通路方式與結構體類似,可以使用點号(.)或箭頭(->)進行通路。但是需要注意,聯合體隻能同時存儲一個成員的值,通路不同成員會覆寫原有的值。例如:

union color c = {0xff0000};
printf("%x\n", c.value);

c.rgb.g = 0xff;
printf("%x\n", c.value);           

小結

本文介紹了C語言中的結構體和聯合體,包括結構體的定義和初始化、結構體成員的通路、結構體作為函數參數和傳回值、結構體指針、結構體的嵌套和匿名結構體、聯合體的定義和初始化、聯合體的成員通路。結構體和聯合體可以将不同類型的資料組織在一起,友善程式的編寫和維護。使用結構體和聯合體時需要注意成員通路方式、結構體指針、聯合體的特殊性等問題,避免程式出現錯誤。

繼續閱讀