一、結構體數組


結構體(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)

內存分配

各成員獨立存儲

所有成員共享同一塊內存

大小

各成員大小之和(對齊後)

最大成員的大小

數據共存

可同時使用所有成員

任意時刻只能使用一個成員

典型用途

組織相關數據

節省內存、多類型解釋同一數據