struct Tag { members; } vars;,標籤可省略。{val1, val2},定義後逐成員賦值。&、成員訪問 .。| 方式 | 代碼 | 特點 |
|---|---|---|
| 傳成員 | func(s.name, s.age) | 簡單,但參數多時繁瑣 |
| 傳結構體(值傳遞) | func(struct Student s) | 副本,函數內修改不影響原值 |
| 傳指標 | func(struct Student *p) | 可修改原值,無拷貝開銷,推薦 |
void print_student(struct Student *p) {
printf("name=%s, age=%d\n", (*p).name, (*p).age); // 方式一
printf("name=%s, age=%d\n", p->name, p->age); // 方式二(推薦)
}
-> 等價於 (*p).,優先級最高,結合性左到右。
struct Student { char *name; int age; } team[] = { {"Tom",12}, {"Jack",13} };
// 或
struct Student team[2] = { {"Tom",12}, {"Jack",13} };
struct Key { char *word; int count; } keytab[] = {
{"auto",0}, {"break",0}, {"case",0}, {"char",0}, {"const",0}
};
#define NKEYS (sizeof keytab / sizeof keytab[0])
// 二分查找(指標版)
struct Key *binsearch(char *word, struct Key *tab, int n) {
struct Key *low = &tab[0], *high = &tab[n];
while (low < high) {
struct Key *mid = low + (high - low) / 2;
int cond = strcmp(word, mid->word);
if (cond < 0) high = mid;
else if (cond > 0) low = mid + 1;
else return mid;
}
return NULL;
}
指標版二分查找關鍵:high 指向尾後元素,mid = low + (high-low)/2 計算中間地址。
struct Word { char c; int i; };
printf("%zu\n", sizeof(struct Word)); // 輸出 8 (非 5)
編譯器插入 3 字節填充使 i 4 字節對齊,結構體總長對齊至 4 的倍數(8)。
sizeof 獲取類型/對象大小,含填充位元組。