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