| 特性 | 數組 | 結構體 |
|---|---|---|
| 元素類型 | 相同 | 可不同 |
| 訪問方式 | 下標 [i] | 成員名 . / -> |
| 內存佈局 | 連續、等長 | 連續、長度可變、含填充 |
| 類型屬性 | 非標量(退化為指針) | 標量(可賦值、傳參、返回) |
struct tag {
member-list;
} variable-list;
三部分至少出現兩個:
tag:類型標籤,用於後續聲明member-list:成員列表(類型 + 名字)variable-list:變量定義列表struct { int a; char b; float c; } x;
每次聲明都是獨立類型,即使成員相同也不能互賦值struct SIMPLE { int a; char b; float c; };
struct SIMPLE x, y[20], *z;
同一標籤聲明的變量類型兼容typedef struct { int a; char b; float c; } Simple;
Simple x, y[20], *z;
Simple 成為類型名,用法同 int,跨文件共享建議放在頭文件.:直接訪問,左操作數為結構體變量->:間接訪問,左操作數為指針,等價於 (*ptr).memberstruct SELF_REF1 {
int a;
struct SELF_REF1 b; // 遞歸定義,無限大小
int c;
};
struct SELF_REF2 {
int a;
struct SELF_REF2 *b; // 指針大小固定,編譯器可確定結構體大小
int c;
};
typedef struct {
int a;
SELF_REF3 *b; // SELF_REF3 此處尚未定義
int c;
} SELF_REF3;
typedef struct SELF_REF3_TAG {
int a;
struct SELF_REF3_TAG *b;
int c;
} SELF_REF3;
struct B; // 前向聲明
struct A {
struct B *partner;
};
struct B {
struct A *partner;
};
先聲明標籤 struct B;,再在 A 中使用指針,最後定義 B 完整結構。
struct INIT_EX {
int a;
short b[10];
Simple c;
} x = {
10,
{1,2,3,4,5}, // 部分初始化數組
{25, 'x', 1.9} // 初始化嵌套結構體
};
typedef 或標籤聲明