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

C語言結構體指標完全指南:宣告、存取、動態配置與陷阱

     編輯:關於C語言

一、宣告語法


// 方式 1:定義結構體同時宣告指標變數
struct String {
    char name[8];
    char sex[2];
    int age;
    char addr[40];
} *student;

// 方式 2:先定義結構體標籤,再宣告指標(推薦)
struct String {
    char name[8];
    char sex[2];
    int age;
    char addr[40];
};
struct String *student;   // 清楚分離型別定義與變數宣告

二、成員存取:-> 運算子

student->name 等價於 (*student).name,前者為語法糖,更符合直覺。


strcpy(student->name, "Lu G.C");
student->age = 18;

三、動態記憶體配置:指標使用前必須初始化

結構體指標僅存放地址,指向的記憶體必須顯式分配:


#include 

student = (struct String *)malloc(sizeof(struct String));
if (student == NULL) {
    // 處理配置失敗
    exit(1);
}

// 使用結構體...

free(student);  // 釋放記憶體
student = NULL; // 防止懸空指標

關鍵點:

  • sizeof(struct String) 自動計算含對齊填充的總大小
  • malloc 返回 void*,C 語言隱性轉換為目標指標型別
  • 配置失敗返回 NULL,必須檢查

四、結構體指標 vs 結構體變數:地址取得差異

五、進階:指向結構體陣列的指標


struct String arr[10];
struct String *p = arr;        // 指向陣列首元素
struct String *p = &arr[0];    // 等價寫法

// 遍歷陣列
for (int i = 0; i < 10; ++i) {
    printf("%s\n", (p+i)->name);  // 或 p[i].name
}

六、常見錯誤與最佳實踐

情境結構體變數結構體指標
宣告struct String s;struct String *p;
取首地址&s(變數名不是地址)p 本身即地址
成員存取s.namep->name
指標運算不支援p+1 跳過整個結構體大小
錯誤後果修正
未初始化直接解參考未定義行為,程式崩潰宣告時初始化 = NULL,使用前檢查
malloc 未檢查返回值後續解參考導致崩潰永遠檢查 if (ptr == NULL)
釋放後未置 NULL懸空指標,重複釋放風險free(ptr); ptr = NULL;
釋放非堆疊記憶體堆破壞只 free 對應 malloc/calloc/realloc 的指標
結構體變數名當指標用編譯錯誤或邏輯錯誤記住:結構體變數名不是地址,取址用 &

七、函數參數傳遞:指標傳址


// 修改呼叫者的結構體內容
void initStudent(struct String *s, const char *name, int age) {
    strcpy(s->name, name);
    s->age = age;
}

int main() {
    struct String *stu = malloc(sizeof(*stu));
    initStudent(stu, "Alice", 20);  // 傳遞指標,避免複製大型結構體
    free(stu);
}

傳遞指標而非結構體值,優勢:

  • 避免堆疊大量複製(效能)
  • 允許函數修改原始資料(語義)
  • 支援動態配置的結構體(靈活性)

結語

結構體指標是 C 語言操作複雜資料結構的核心工具。掌握 -> 存取、malloc/free 生命週期管理、函數傳址參數三大核心,並養成「初始化、檢查、釋放置空」的防衛式編程習慣,能避開 90% 的指標相關 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved