首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言結構體進階:函數傳遞、指標訪問、數組應用與記憶體對齊

     編輯:關於C

結構體基礎回顧

  • 聲明: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 獲取類型/對象大小,含填充位元組。
  • 理解對齊規則有助於優化記憶體佈局(將寬類型集中聲明)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved