用户自定义的数据类型,用于存储不同的数据类型。
语法:struct 结构体名 {结构体成员列表};
通过结构体创建变量的三种方式:
Struct 结构体名 变量名
Struct 结构体名 变量名 = {成员1值,成员2值,…}
定义结构体时顺便创建变量
下面通过代码来说明
#include<iostream> #include<vector> #include<array> using namespace std; struct student { //成员列表 //姓名 string name; //年龄 int age; //分数 int scores; }s3; int main() { //Struct 结构体名 变量名 struct student s1; s1.name = "zhangsan"; //给s1属性赋值,通过.访问结构体变量中的属性 s1.age = 18; s1.scores = 100; cout << "name: " << s1.name << " age: " << s1.age << " scores: " << s1.scores << endl; // Struct 结构体名 变量名 = { 成员1值,成员2值,… } struct student s2 = { "Lisi", 19, 80 }; cout << "name: " << s2.name << " age: " << s2.age << " scores: " << s2.scores << endl; //定义结构体时顺便创建变量 s3.name = "wangwu"; //给s1属性赋值,通过.访问结构体变量中的属性 s3.age = 18; s3.scores = 100; cout << "name: " << s3.name << " age: " << s3.age << " scores: " << s3.scores << endl; student s4; // 创建结构体变量的时候关键字struct可以省略,创建结构体时不可以省略。 return 0; }
语法:struct 结构体名 数组名[元素个数] = {{}, {}, …, {}}
下面在代码中展示具体操作
#include<iostream> #include<vector> #include<array> using namespace std; struct student { //成员列表 //姓名 string name; //年龄 int age; //分数 int scores; }; int main() { //创建结构体数组 struct student stuArray[3] = { {"ZhangSan", 18, 100}, {"LiSi", 28, 99}, {"WangWu", 25, 66}, }; //给结构体数组中的元素赋值 stuArray[2].name = "Zhaowu"; stuArray[2].age = 80; stuArray[2].scores = 60; // 遍历结构体数组 for (int i = 0; i < 3; i++) { cout << "name: " << stuArray[i].name << " age: " << stuArray[i].age << " scores: " << stuArray[i].scores << endl; } return 0; }
通过操作符->访问结构体属性。
下面在代码中展示具体操作
#include<iostream> #include<vector> #include<array> using namespace std; struct student { //姓名 string name; //年龄 int age; //分数 int scores; }; int main() { //创建结构体变量 student s = { "Lisi", 19, 80 }; //通过指针指向结构体变量 student* p = &s; //通过指针访问结构体变量中的数据 cout << "name: " << p->name << " age: " << p->age << " scores: " << p->scores << endl; return 0; }
结构体的成员中可以是另一个结构体。
下面在代码中展示具体操作
#include<iostream> #include<vector> #include<array> using namespace std; struct student { string name; int age; int scores; }; struct teacher{ int id; string name; int age; student stu; }; int main() { //创建结构体变量 teacher t; t.id = 10000; t.name = "Wang"; t.age = 50; t.stu.name = "Lisi"; t.stu.age = 19; t.stu.scores = 80; cout << "id: " << t.id << " age: " << t.age << " name: " << t.name << endl; cout << "stu_name: " << t.stu.name << " stu_age: " << t.stu.age << " stu_score: " << t.stu.scores << endl; return 0; }
将结构体作为参数向函数内传递,传递方式有两种:值传递和地址传递
下面在代码中展示具体操作
#include<iostream> #include<vector> #include<array> using namespace std; struct student { string name; int age; int scores; }; // 值传递 void printStudent1(student s) { s.age = 100; cout << "stu_name: " << s.name << " stu_age: " << s.age << " stu_score: " << s.scores << endl; } // 地址传递 void printStudent2(student * p) { p->age = 200; cout << "stu_name: " << p->name << " stu_age: " << p->age << " stu_score: " << p->scores << endl; } int main() { //创建结构体变量 student s; s.name = "ZhangSan"; s.age = 20; s.scores = 100; printStudent1(s); //值传递不会影响实参 cout << "值传递结果:stu_name: " << s.name << " stu_age: " << s.age << " stu_score: " << s.scores << endl; printStudent2(&s);//地址传递影响实参 cout << "stu_name: " << s.name << " stu_age: " << s.age << " stu_score: " << s.scores << endl; return 0; }
常量指针节省内存案例如下。
#include<iostream> #include<vector> #include<array> using namespace std; struct student { string name; int age; int scores; }; // 值传递 void printStudent1(student s) { s.age = 100; cout << "stu_name: " << s.name << " stu_age: " << s.age << " stu_score: " << s.scores << endl; } // 地址传递 void printStudent2(student * p) { p->age = 200; cout << "stu_name: " << p->name << " stu_age: " << p->age << " stu_score: " << p->scores << endl; } void printStudent3(const student* p) { // p->age = 200; 常量指针指向可以改,但是指向的数值不可以修改,会报错 cout << "stu_name: " << p->name << " stu_age: " << p->age << " stu_score: " << p->scores << endl; } int main() { //创建结构体变量 student s; s.name = "ZhangSan"; s.age = 20; s.scores = 100; printStudent1(s); // 每传递一次形参就必须额外分配一次内存,如果结构体变量过多,内存占用将会非常大 printStudent2(&s);//地址传递影响实参,权限过大 printStudent3(&s);//使用常量指针,每次传递指针只需要占用4个字节,并且不会影响实参 return 0; }
#include<iostream> #include<vector> #include<array> #include<ctime> using namespace std; struct student { string sName; int scores; }; struct Teacher { string tName; struct student sArray[5]; }; void allocateSpace(struct Teacher tArray[], int len) { string nameSeed = "ABCDE"; // 对老师赋值 for (int i = 0; i < len; i++) { tArray[i].tName = "Teacher_"; tArray[i].tName += nameSeed[i]; // 对学生循环赋值 for (int j = 0; j < 5; j++) { tArray[i].sArray[j].sName = "Student_"; tArray[i].sArray[j].sName += nameSeed[j]; int random = rand() % 60 + 40; // 对60取余后范围为0~59,+40后范围为40~99 tArray[i].sArray[j].scores = random; } } } void printInfo(struct Teacher tArray[], int len) { for (int i = 0; i < len; i++) { cout << "Teacher name: " << tArray[i].tName << endl; for (int j = 0; j < 5; j++) { cout << "\tStudent name: " << tArray[i].sArray[j].sName; cout << " Score: " << tArray[i].sArray[j].scores << endl; } } } int main() { // 随机数种子 srand((unsigned int)time(NULL)); // 创建三名老师的数组 Teacher tArray[3]; //通过函数对老师和学生信息赋值 int len = sizeof(tArray) / sizeof(tArray[0]); allocateSpace(tArray, len); //打印信息 printInfo(tArray, len); return 0; }