typedef struct stu {
char name[10], gender;
int score;
} STU;
void f(char *p) {
strcpy(p, "Qian");
}
int main() {
STU a = {"zhao", 'm', 290}, b;
b = a; // 關鍵行
f(b.name);
b.gender = 'f';
b.score = 350;
printf("%s,%c,%d,", a.name, a.gender, a.score);
printf("%s,%c,%d,", b.name, b.gender, b.score);
return 0;
}
輸出:zhao,m,290,Qian,f,350,
疑問:b = a 以為是讓 b 指向 a 的地址,為何修改 b 成員不影響 a?
b = a 是結構體變量之間的「值拷貝」,而非指針賦值。
STU a, b; 定義了兩個**獨立的結構體變量**,各自佔據棧上一塊內存。b = a 將 a 的所有成員逐字節複製到 b,兩者內容相同但**地址不同**,互不干擾。f(b.name) 修改的是 b 內部的 name 數組,a 的 name 保持不變。STU a = {"zhao", 'm', 290};
STU *b = &a; // b 是指針,指向 a 的地址
b->gender = 'f'; // 修改 a 的成員
// 或 (*b).gender = 'f';
這時 b 與 a 共享同一塊內存,修改 b 即修改 a。
b = a)。STU *b = &a)。若結構體含指針成員(如 char *name),b = a 只拷貝指針值,兩結構體指向同一字符串,修改內容會相互影響,需手動深拷貝。本例中成員皆為值類型(數組、基本類型),故拷貝安全。
b = a **不是**讓 b 指向 a,而是**把 a 的內容複製給 b**。理解「值語義」與「指針語義」的區別,是掌握 C/C++ 內存模型的關鍵一步。