一、結構體數組
結構體(struct) 是一種用户自定義的數據類型,可以將多個不同類型的數據組合在一起。
結構體數組 就是將多個相同類型的結構體變量組織成一個數組。
示例:
/*
結構體:封裝一些基本類型用於我們自定義的類型
班級管理系統:56個同學,編號,年齡,性別,成績
聊天會話
*/
#include<iostream>
using namespace std;
struct student {
string id;
string name;
int age;
string sex;
double scorce;
};
int main() {
student students[2];
// 這種寫法不行
// students[0] = {"00003", "xaye", 27, "男", 88}
// students[1] = {"00004", "xaye2", 37, "男", 77}
students[0].id = "00003";
students[0].name = "xaye";
students[0].age = 27;
students[0].sex = "男";
students[0].scorce = 88;
students[1].id = "00004";
students[1].name = "xaye2";
students[1].age = 37;
students[1].sex = "男";
students[1].scorce = 77;
// 使用
cout << "id: " << students[0].id << ", name: " << students[0].name << ", age: " <<
students[0].age << ", sex: " << students[0].sex << ", scorce: " << students[0].scorce << endl;
cout << "id: " << students[1].id << ", name: " << students[1].name << ", age: " <<
students[1].age << ", sex: " << students[1].sex << ", scorce: " << students[1].scorce << endl;
return 0;
}
xaye@orange:~/code/dev/11$ ./a.out
id: 00003, name: xaye, age: 27, sex: 男, scorce: 88
id: 00004, name: xaye2, age: 37, sex: 男, scorce: 77
寫法2
/*
結構體:封裝一些基本類型用於我們自定義的類型
班級管理系統:56個同學,編號,年齡,性別,成績
聊天會話
*/
#include<iostream>
using namespace std;
struct student {
string id;
string name;
int age;
string sex;
double scorce;
};
int main() {
student students[2] = {
{"00003", "xaye", 27, "男", 88},
{"00004", "xaye2", 37, "男", 77}
};
// 使用
cout << "id: " << students[0].id << ", name: " << students[0].name << ", age: " <<
students[0].age << ", sex: " << students[0].sex << ", scorce: " << students[0].scorce << endl;
cout << "id: " << students[1].id << ", name: " << students[1].name << ", age: " <<
students[1].age << ", sex: " << students[1].sex << ", scorce: " << students[1].scorce << endl;
return 0;
}
xaye@orange:~/code/dev/11$ ./a.out
id: 00003, name: xaye, age: 27, sex: 男, scorce: 88
id: 00004, name: xaye2, age: 37, sex: 男, scorce: 77
結構體之間相互賦值
#include<iostream>
using namespace std;
struct student {
string id;
string name;
int age;
string sex;
double scorce;
};
int main() {
student student1 = {
"00005", "xaye", 27, "男", 100
};
student student2 = student1;
// 使用
cout << "id: " << student1.id << ", name: " << student1.name << ", age: " <<
student1.age << ", sex: " << student1.sex << ", scorce: " << student1.scorce << endl;
// 使用
cout << "id: " << student2.id << ", name: " << student2.name << ", age: " <<
student2.age << ", sex: " << student2.sex << ", scorce: " << student2.scorce << endl;
return 0;
}
xaye@orange:~/code/dev/11$ ./a.out
id: 00005, name: xaye, age: 27, sex: 男, scorce: 100
id: 00005, name: xaye, age: 27, sex: 男, scorce: 100
特點:
- 每個數組元素是一個完整的結構體;
- 各成員可同時存在,互不影響;
- 內存佔用 = 單個結構體大小 × 元素個數。
二、聯合體
聯合體(union) 也是一種用户自定義類型,但與結構體不同:所有成員共享同一塊內存空間,任意時刻只能存儲其中一個成員的值。
示例:
/*
共用體(聯合體):可以存儲不同的基本數據類型,但是同時只能存一種
id: "20110201", 20110201
*/
#include<iostream>
using namespace std;
#include <cstring> // +
// 聯合體用的比較少
union id {
char id_str[10];
long id_long;
};
struct student {
string id;
string name;
int age;
string sex;
double scorce;
};
int main(){
union id id1;
strcpy(id1.id_str, "20110201");
// id1.id_str = "20110201"; 這種寫法不行
id1.id_long = 20110201;
cout << "id_str: " << id1.id_str << ", id_long: " << id1.id_long << endl;
// 輸出:id_str: y�2, id_long: 20110201
return 0;
}
id_str: y�2, 亂碼原因:後面的 20110201 賦值,將前面的 字符串覆蓋了
特點:
- 所有成員共用同一內存地址;
- 聯合體大小 = 最大成員的大小;
- 適用於節省內存或處理不同類型數據的場景(如解析協議、硬件寄存器等);
- 不能同時保存多個成員的值,寫入一個成員會覆蓋其他成員。
三、總結對比:
|
特性
|
結構體(struct)
|
聯合體(union)
|
|
內存分配
|
各成員獨立存儲
|
所有成員共享同一塊內存
|
|
大小
|
各成員大小之和(對齊後)
|
最大成員的大小
|
|
數據共存
|
可同時使用所有成員
|
任意時刻只能使用一個成員
|
|
典型用途
|
組織相關數據
|
節省內存、多類型解釋同一數據
|