C++结构体

简介: C++结构体

一、结构体基本概念

结构体属于用户自定义的数据类型允许用户存储不同的数据类型。

二、结构体定义和使用

#include <iostream>
#include <string>
 
using namespace std;
//1、创建学生数据类型(姓名、年龄、分数)
//自定义数据类型,一些类型集合组成的类型 语法 struct 类型名称{成员列表}
struct Student {
//    成员列表
//姓名
    string name;
//年龄
    int age;
//成绩
    int score;
} s3;
 
 
int main() {
//2、通过学生类型创建具体学生
//2.1 struct Student s1赋值
    struct Student s1;
    s1.name = "zhangsan";
    s1.age = 18;
    s1.score = 100;
    cout << "姓名:" << s1.name << "年龄:" << s1.age << "分数:" << s1.score << endl;
//    2.2  struct Student s2 = {"lisi", 28, 80};
    struct Student s2 = {"lisi", 28, 80};
    cout << "姓名:" << s2.name << "年龄:" << s2.age << "分数:" << s2.score << endl;
//2.3 定义的时候创建 不推荐
    s3.name = "wangwu";
    s3.age = 18;
    s3.score = 100;
    cout << "姓名:" << s3.name << "年龄:" << s3.age << "分数:" << s3.score << endl;
    return 0;
}
 
姓名:zhangsan年龄:18分数:100
姓名:lisi年龄:28分数:80
姓名:wangwu年龄:18分数:100

三、结构体数组

#include <iostream>
#include <string>
 
using namespace std;
//1、创建学生数据类型(姓名、年龄、分数)
//自定义数据类型,一些类型集合组成的类型 语法 struct 类型名称{成员列表}
struct Student {
//    成员列表
//姓名
    string name;
//年龄
    int age;
//成绩
    int score;
};
 
 
int main() {
    struct Student arr[3] = {{"zhansan", 18, 100},
                             {"lisi",    19, 90},
                             {"wangwu",  20, 80}};
    int length = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < length; ++i) {
        cout << "姓名:" << arr[i].name
             << "年龄:" << arr[i].age
             << "分数:" << arr[i].score << endl;
    }
    return 0;
}
 
姓名:zhansan年龄:18分数:100
姓名:lisi年龄:19分数:90
姓名:wangwu年龄:20分数:80

四、结构体指针

#include <iostream>
#include <string>
 
using namespace std;
//1、创建学生数据类型(姓名、年龄、分数)
//自定义数据类型,一些类型集合组成的类型 语法 struct 类型名称{成员列表}
struct Student {
//    成员列表
//姓名
    string name;
//年龄
    int age;
//成绩
    int score;
};
 
 
int main() {
//    1、创建
Student s1={"zhangsan",18,100};
//2、指针指向变量
Student* p=&s1;
//3、功过指针访问结构体变量中的数据 指针访问结构体数组使用:->
    cout << "姓名:" << p->name
         << "年龄:" << p->age
         << "分数:" << p->score << endl;
    return 0;
}
姓名:zhangsan年龄:18分数:100

五、结构体嵌套结构体

#include <iostream>
#include <string>
 
using namespace std;
//1、创建学生数据类型(姓名、年龄、分数)
struct student {
//    成员列表
//姓名
    string name;
//年龄
    int age;
//成绩
    int score;
};
//教师结构体
struct teacher {
//    成员列表
    int id;
    string name;
    int age;
    struct student stu;
};
 
int main() {
    teacher t1 = {1, "wanglaoshi", 28,
                  {"zhangsan", 18, 100}};
    teacher *p = &t1;
    cout << p->stu.name << endl;
    return 0;
}
 
zhangsan

六、结构体做函数参数

#include <iostream>
#include <string>
 
using namespace std;
//1、创建学生数据类型(姓名、年龄、分数)
struct student {
//    成员列表
//姓名
    string name;
//年龄
    int age;
//成绩
    int score;
};
 
//值传递
void printStu1(struct student stu) {
    stu.age=100;
    cout << "printStu1 打印 姓名:" << stu.name
         << "年龄:" << stu.age
         << "分数:" << stu.score << endl;
}
 
//地址传递
void printStu2(struct student *p) {
    p->age=200;
    cout << "printStu2 打印 姓名:" << p->name
         << "年龄:" << p->age
         << "分数:" << p->score << endl;
}
 
int main() {
    student stu = {"zhangsan", 18, 100};
 
    printStu1(stu);
    cout << "main1 打印 姓名:" << stu.name
         << "年龄:" << stu.age
         << "分数:" << stu.score << endl;
    printStu2(&stu);
    cout << "main2 打印 姓名:" << stu.name
         << "年龄:" << stu.age
         << "分数:" << stu.score << endl;
    return 0;
}
 
printStu1 打印 姓名:zhangsan年龄:100分数:100
main1 打印 姓名:zhangsan年龄:18分数:100
printStu2 打印 姓名:zhangsan年龄:200分数:100
main2 打印 姓名:zhangsan年龄:200分数:100

七、结构体中const使用场景

#include <iostream>
#include <string>
 
using namespace std;
//1、创建学生数据类型(姓名、年龄、分数)
struct student {
//    成员列表
//姓名
    string name;
//年龄
    int age;
//成绩
    int score;
};
 
 
//地址传递 指针占用内存小 不会复制副本 使用const限定只读
void printStu(const struct student *p) {
    cout << "printStu 打印 姓名:" << p->name
         << "年龄:" << p->age
         << "分数:" << p->score << endl;
}
 
int main() {
    student stu = {"zhangsan", 18, 100};
 
    cout << "main 打印 姓名:" << stu.name
         << "年龄:" << stu.age
         << "分数:" << stu.score << endl;
    printStu(&stu);
 
    return 0;
}
 


main 打印 姓名:zhangsan年龄:18分数:100
printStu 打印 姓名:zhangsan年龄:18分数:100

八、结构体案例

学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值最终打印出老师数据以及老师所带的学生数据。

#include <iostream>
#include <string>
#include<ctime>
 
 
using namespace std;
struct student {
    string sName;
    int score;
};
struct teacher {
    string tName;
    struct student stus[5];
};
 
//初始化数组
void allocatSpace(struct teacher arr[], int len) {
    string nameSeed = "ABCDE";
    for (int i = 0; i < len; ++i) {
        arr[i].tName = "tearch_";
        arr[i].tName += nameSeed[i];
        for (int j = 0; j < 5; ++j) {
            arr[i].stus[j].sName = "student_";
            arr[i].stus[j].sName += nameSeed[i];
            arr[i].stus[j].score = rand() % 60 + 40;
        }
    }
}
 
//打印数据
void printTearch(struct teacher arr[], int len) {
    for (int i = 0; i < len; ++i) {
        teacher t = arr[i];
        cout << t.tName << " ";
        for (int j = 0; j < 5; ++j) {
            cout << t.stus[j].sName << " ";
            cout << t.stus[j].score << " ";
        }
        cout << endl;
    }
}
 
int main() {
//   创建老师数组
    srand((unsigned int) time(NULL));
    struct teacher tArr[3];
    int len = sizeof(tArr) / sizeof(tArr[0]);
//    初始化数据
    allocatSpace(tArr, len);
//    打印数据
    printTearch(tArr, len);
 
    return 0;
}
 
tearch_A student_A 64 student_A 88 student_A 83 student_A 90 student_A 93
tearch_B student_B 92 student_B 69 student_B 69 student_B 98 student_B 65
tearch_C student_C 69 student_C 86 student_C 72 student_C 57 student_C 95

设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄.

通过冒泡排序的算法,将数组中的英雄按照年龄进行升席排序,最终打印排序后的结果。

#include <iostream>
#include <string>
#include<ctime>
 
 
using namespace std;
struct hero {
    string name;
    int age;
};
 
void sortHearo(struct hero hearos[], int len) {
    for (int i = 0; i < len; ++i){
        for (int j = i+1; j < len; ++j){
            if(hearos[j].age<hearos[i].age){
                hero tem=hearos[i];
                hearos[i]=hearos[j];
                hearos[j]=tem;
            }
        }
    }
}
 
int main() {
    struct hero heros[5] = {
            {"刘备", 23},
            {"关羽", 22},
            {"张飞", 20},
            {"赵云", 21},
            {"貂蝉", 19}
    };
    int len=sizeof(heros)/sizeof(heros[0]);
    for (int i = 0; i < len; ++i){
        cout<<"姓名: "<<heros[i].name<<" 年龄: "<<heros[i].age<<endl;
    }
    cout<<endl;
    sortHearo(heros,len);
    for (int i = 0; i < len; ++i){
        cout<<"姓名: "<<heros[i].name<<" 年龄: "<<heros[i].age<<endl;
    }
    return 0;
}
 


姓名: 刘备 年龄: 23
姓名: 关羽 年龄: 22
姓名: 张飞 年龄: 20
姓名: 赵云 年龄: 21
姓名: 貂蝉 年龄: 19
 
姓名: 貂蝉 年龄: 19
姓名: 张飞 年龄: 20
姓名: 赵云 年龄: 21
姓名: 关羽 年龄: 22
姓名: 刘备 年龄: 23

目录
相关文章
|
1月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
1月前
|
C++
C++系列十四:结构体
C++系列十四:结构体
|
1月前
|
C++
.C++中结构体数组docx
.C++中结构体数组docx
19 0
|
7月前
|
编译器 C语言 C++
C/C++内存对齐规则(结构体、联合体、类)
C/C++内存对齐规则(结构体、联合体、类)
|
9月前
|
存储 C++
32.【C/C++ 结构体全类型 (详解)】(二)
32.【C/C++ 结构体全类型 (详解)】
51 0
|
9月前
|
存储 编译器 C++
32.【C/C++ 结构体全类型 (详解)】(一)
32.【C/C++ 结构体全类型 (详解)】
48 0
|
8天前
|
存储 数据管理 程序员
C++一分钟之-结构体与联合体(Union)
【6月更文挑战第20天】在C++中,结构体(struct)用于组合多种数据类型形成复合类型,成员变量占用独立内存,适合存储不同类型且同时有效的数据。联合体(union)则让所有成员共享同一内存,适合节省空间和进行低级别类型转换,但需小心数据覆盖。通过`struct`和`union`,程序员能构建更灵活的代码,但也需留意内存对齐和数据管理等问题。
25 2
|
1月前
|
C++
C++程序中的结构体类型
C++程序中的结构体类型
25 1
|
1月前
|
设计模式 算法 编译器
【C++ 泛型编程 入门篇】C++ 元编程 :模板结构体的的使用教程
【C++ 泛型编程 入门篇】C++ 元编程 :模板结构体的的使用教程
116 1
|
1月前
|
存储 程序员 Shell
【C/C++ 基本语法 结构体】C++ 结构体声明(定义)以及不同写法的差异
【C/C++ 基本语法 结构体】C++ 结构体声明(定义)以及不同写法的差异
31 1