C++:结构体

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
语法:struct 结构体名 {结构体成员列表}
通过结构体创建变量有三种方式:

  • struct结构体名 变量名
  • struct结构体名 变量名 = {成员1值,成员2值,。。。}
  • 定义结构体时顺便创建变量
#include 
using namespace std;
#include 

//创建学生数据类型: 学生包括(姓名,年龄,分数)

struct Student {
    //成员列表
    
    //姓名
    string name;
    //年龄
    int age;
    //分数
    int scores;
}s3;//创建结构体变量

//通过学生类型创建具体学生




int main() {
    //在这里struct关键字可省略
    //1  struct Student s1;
    struct Student s1;
    s1.name = "张三";
    s1.age = 18;
    s1.scores = 100;
    cout << "姓名:" << s1.name << endl;
    cout << "年龄:" << s1.age << endl;
    cout << "分数:" << s1.scores << endl;
    //2  struct Student s2 = {..};
    struct Student s2 = { "李四",19,30 };
    cout << "姓名:" << s2.name << endl;
    cout << "年龄:" << s2.age << endl;
    cout << "分数:" << s2.scores << endl;

    //3  在定义结构体时顺便创建结构体变量
    s3.name = "万个牛";
    s3.age = 9;
    




    system("pause");
    return 0;
}

一 结构体数组
将自定义的结构体放到数组中方便维护

 struct Student arr[3] = {
        {"假假按揭啊",2,10},
        {"kikiki",30,980},
        {"lala",5,23}

    };
    arr[0].name = "titi";//给第一个人改名字
    arr[1].age = 333;//给第二个人改年龄
   //遍历
    for (int i = 0; i < 3; i++) {
        cout << "姓名:" << arr[i].name << "  年龄: " << arr[i].age << " 分数: " << arr[i].scores << endl;
    }

二 结构体指针
通过指针访问结构体成员

 //通过指针指向结构体变量
    struct Student* p = &s1;

    //通过指针访问结构体变量中的数据
    cout << "姓名:" << p->name << "  年龄: " << (*p).age << " 分数: " << p->scores << endl;
    //p->name 相当于(*p).name 解引用运算符优先级低于点运算符优先级,所以要加括号

三 结构体嵌套结构体
结构体中的成员可以是另一个结构体

#include 
using namespace std;
#include 

//学生
struct student {
    string name;
    int age;
    int score;
};
//老师
struct teacher {
    int id;
    string name;
    int age;
    struct student stu;//辅导的学生
};



int main() {
    teacher t;
    t.name = "颖子";
    t.id = 1;
    t.age = 18;
    t.stu.name = "蛋黄";
    t.stu.age = 18;
    t.stu.score = 100;
    cout << "老师姓名: " << t.name << "  id: " << t.id << "  老师年龄: " << t.age << "  老师辅导的学生: " << t.stu.name << "  年龄:  " <<t.stu.age<< " 分数: " << t.stu.score << endl;

   

    system("pause");
    return 0;
}

四 结构体作为函数参数

  • 值传递
  • 地址传递
#include 
using namespace std;
#include 
//学生
struct student {
    int age;
    string name;
    int score;

};

//值传递
void  printStudent1(struct student s){
    cout << s.name << s.age << s.score << endl;
}
//地址传递
void  printStudent2(struct student *p) {
    p->name = "巨头";
    cout << p->name << (*p).age << p->score << endl;
    //“—>”成员访问运算符
}
int main() {
   //结构体做函数参数
   //将学生传入到一个参数中,打印学生所有信息

    student s;
    s.name = "大头";
    s.age = 18;
    s.score = 100;

    cout << "main 函数中打印结果: " << s.name << s.age << s.score << endl;
    //printStudent1(s);
    printStudent2(&s);
    system("pause");
    return 0;
}

五 结构体中const使用场景
用const来防止误操作

#include 
using namespace std;
#include 

struct student {
    int age;
    string name;
    int score;

};
//将函数中的形参改为指针可以减少内存空间,而且不会复制新的副本出来
//加入const后,一旦有修改就会报错,防止误操作
void print(const student *s) {
    cout << s->age << s->name << s->score << endl;

}

int main() {
    student s = {23,"hhh",22 };
    print(&s);

 
    system("pause");
    return 0;
}


案例:共3个老师,每名老师有五个学生,学生存放在老师的结构体中
学生有姓名,考试分数
创建数组存放3名老师,通过函数给每个老师及其学生赋值
最终打印出老师数据和其所带学生的数据

#include 
using namespace std;
#include 
#include

//学生结构体
struct student {
    int age;
    string sname;
    int score;

};

//老师结构体
struct teacher {
    string tname;
    struct student s[5];
};

 //给老师和函数赋值的函数
void space(struct teacher x[],int len) {

    string nameSeed = "ABCDE";
    //给老师赋值
    for (int i = 0; i < len; i++) {
        x[i].tname = "Teacher_";
        x[i].tname += nameSeed[i];

        //给学生赋值
        for (int j = 0; j < 5; j++) {
            x[i].s[j].sname = "student_";
            x[i].s[j].sname += nameSeed[j];
            int random = rand() % 61 + 40;//40--100
            x[i].s[j].score = random;
        }

    }
}

//打印
void print(struct teacher y[],int len){
    for (int i = 0; i < len; i++) {
        cout << "老师姓名: " << y[i].tname << endl;
        for (int j = 0; j < 5; j++) {
            cout << "\t学生姓名: " << y[i].s[j].sname << " \t分数: " << y[i].s[j].score << endl;
        }
    }

}

int main() {
    //随机数种子
    srand((unsigned int)time(NULL));

    //老师数组
    struct teacher tarr[3];
    //通过函数给每个老师及其学生赋值
    int len = sizeof(tarr) / sizeof(tarr[0]);
    space(tarr, len);
    //打印
    print(tarr, len);

 
    system("pause");
    return 0;
}

案例二
设计一个英雄的结构体,包括姓名,年龄,性别
创建结构体数组,数组中存放5名英雄
通过冒泡排序,将数组中的英雄按照年龄升序排序,最后打印

#include 
using namespace std;
#include 
#include

//英雄结构体
struct Hero {
    string name;
    int age;
    string sex;
};

//冒泡排序
void bubbleSort(struct Hero heroArray[], int len) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < 5 - i - 1; j++) {
            if (heroArray[j].age > heroArray[j + 1].age) {
                struct Hero temp = heroArray[j];//临时变量保存结构体元素
                heroArray[j] = heroArray[j + 1];
                heroArray[j + 1] = temp;
            }

        }
    };
   
  };

void print(struct Hero heroArray[],int len) {
    for (int i = 0; i < len; i++) {
        cout << "姓名: " << heroArray[i].name << "  年龄: " << heroArray[i].age << " 性别: " << heroArray[i].sex << endl;
    };
}

int main() {
    //创建数组存放英雄
    struct Hero heroArray[5] = {
        {"刘备",23,"男"},
        {"关羽",22,"男"},
        {"张飞",20,"男"},
        {"赵云",21,"男"},
        {"貂蝉",19,"女"}

    };
    int len = sizeof(heroArray) / sizeof(heroArray[0]);
  
   
    //对数组进行排序
    bubbleSort(heroArray, len);
    //打印
    print(heroArray, len);
 
    system("pause");
    return 0;
}

C++:结构体_第1张图片
注意:传入数组其实就是按地址传递,会修改原数据

你可能感兴趣的:(c++,学习笔记)