typedef struct {
char name[10];
char sex;
long num;
} ElemType;
typedef struct {
ElemType *elem; // 動態數組指針
int length;
int listsize;
} SqList;
// 錯誤函數:值傳遞結構體
void MergeList_Sq(SqList La, SqList Lb, SqList *Lc) {
ElemType *pa, *pb;
pa = La->elem; // 編譯錯誤:La 不是指針,無法用 ->
pb = Lb->elem;
// ...
}
// 正確聲明:所有可修改或涉及指針操作的結構體參數用指針
void MergeList_Sq(SqList *La, SqList *Lb, SqList *Lc) {
ElemType *pa = La->elem; // 正確:La 是指針,用 ->
ElemType *pb = Lb->elem;
// ...
}
// 調用時取地址
SqList listA, listB, listC;
MergeList_Sq(&listA, &listB, &listC);
| 維度 | 值傳遞 (Struct) | 指針傳遞 (Struct*) |
|---|---|---|
| 語法訪問 | `param.member` | `param->member` |
| 內存開銷 | 拷貝整個結構體 (含指針成員) | 僅拷貝指針大小 (4/8 字節) |
| 修改原結構體 | 不可 (修改副本) | 可 (修改原對象) |
| 修改指針指向的數據 | 可 (淺拷貝指向同一塊內存) | 可 |
| 適用場景 | 小型、只讀、無指針成員結構體 | 大結構體、需修改、含動態內存指針、鏈表節點 |
// 僅讀取不修改結構體本身 (但可修改 elem 指向的數據)
void ReadOnlyFunc(const SqList *list) {
// list->length = 10; // 編譯錯誤:不能修改 length
list->elem[0].num = 100; // 允許:修改指向的數據
}
// 完全只讀 (指針指向的數據也不修改)
void ReadOnlyData(const SqList *const list) { // 或 const ElemType *elem
// ...
}
C 語言結構體參數傳遞**默認值傳遞 (拷貝)**。含指針成員、需修改、或較大結構體**必須用指針傳遞**。錯誤代碼將值參數誤當指針用 `->` 訪問,修正為指針參數並配合 `&` 調用即可。養成「結構體參數默認指針,只讀加 `const`」的習慣。