基本概念
一、定义和使用
1、struct Student s1; //c++中,struct可以省略 Student s1;
2、struct Student s2={ ... }; //Student s2={ ... };
3、struct Student
{...
} s3;
// string name; //字符串定义时
s1.name //这样使用
struct Student
{
string name;
int age;
float score;
}s3; //顺便定义结构体变量
int main()
{
Student s1;
//struct Student s1;
s1.name = "张三"; //name 为字符串
s1.age = 15;
s1.score = 98.5;
cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 成绩:" << s1.score << endl;
二、结构体数组
struct Student stuArray[3] = {
{"张三",16,78.5},
{"李四",15,88},
{"王五",15,100}
};
stuArray[2].name = "赵六";
cout << " 成绩:" << stuArray[i].score << endl;
三、结构体指针
struct Student s = { "张三",15,88 };
struct Student* p = &s; //1.指针指向张三
struct Student stuArray[2] = {
{"李四",15,75},
{"王五",16,100}
};
struct Student* p1 = stuArray; //2.指针指向李四
p1++; //3.指针指向王五
struct Student s = { "张三",15,88 };
//1
struct Student* p = &s;
cout << "姓名:" << p->name << " 年龄:" << p->age << " 成绩:" << p->score << endl;
struct Student stuArray[2] = {
{"李四",15,75},
{"王五",16,100}
};
//2
struct Student* p1 = stuArray;
cout << "姓名:" << p1->name << " 年龄:" << p1->age << " 成绩:" << p1->score << endl;
//3
p1++;
cout << "姓名:" << p1->name << " 年龄:" << p1->age << " 成绩:" << p1->score << endl;
四、结构体嵌套结构体
tch.name = "张丽丽";
tch.stu.name = "张三";
struct Teacher* p1 = &tch;
p1->name
p1->stu.name
struct Student
{
string name;
int age;
float score;
};
struct Teacher
{
int id;
string name;
struct Student stu;
};
五、结构体做函数参数
1.值传递 //不想对结构体元素修改,用值传递
printStudent1(s);
2.地址传递 //想对结构体元素修改,用地址传递
printStudent(&s);
//值传递
void printStudent1(struct Student stu)
{
cout << endl << "在值传递函数中" << endl;
stu.age = 10000;
cout << "姓名:" << stu.name;
cout << " 年龄:" << stu.age;
cout << " 成绩:" << stu.score << endl;
}
//地址传递
void printStudent(struct Student* p)
{
cout << endl << "在地址传递函数中" << endl;
p->age = 2000;
cout << "姓名:" << p->name;
cout << " 年龄:" << p->age;
cout << " 成绩:" << p->score << endl;
}
六、结构体中const 的使用场景
const 防止误操作
值传递,拷贝一份原结构体副本,浪费内存
地址传递,节省内存,指针只占4字节, 但害怕错误修改,加const
void printStudent(const struct Student *s)
printStudent(&s);
七、案例
1.结构体数组—函数参数
struct Teacher tArray[3];
可以指针传递,也可以数组传递(更直观一点,一眼看出来传的是数组)
void createTeacher(struct Teacher tArray[ ], int len, int snum)
createTeacher(tArray, len,5);
2.赋值时,string 类型 += 连接
string nameSeed="ABCDE"; // nameSeed[1]=B;
tArray[i].sArray[j].sname = "Student_";
tArray[i].sArray[j].sname += nameSeed[j];
3.随机数
产生0~100的随机数
int num = rand( )%41 + 60 ; // 0 ~ 40 0+60=60 ~ 40+60=100
srand((unsigned)time(NULL));
#include<iostream>
using namespace std;
#include<string>
#include<ctime>
struct Student
{
string sname;
float score;
};
struct Teacher
{
string tname;
struct Student sArray[5];
};
//给老师和学生赋值,参数1:可以指针传递,也可以数组传递(更直观一点,一眼看出来传的是数组)
void createTeacher(struct Teacher tArray[], int len,int snum)
{
string nameSeed = "ABCDE";
for (int i = 0; i < len; i++)
{
tArray[i].tname = "Teacher_";
tArray[i].tname += nameSeed[i];
for (int j = 0; j < snum; j++)
{
int score = rand() % 55 + 45; //0+35=35 ~ 65+35=100
tArray[i].sArray[j].sname = "Student_";
tArray[i].sArray[j].sname += nameSeed[j];
tArray[i].sArray[j].score = score;
}
}
}
void printTeacher(struct Teacher tArray[],int len,int snum)
{
for (int i = 0; i < len; i++)
{
cout << "教师:" << tArray[i].tname << endl;
for (int j = 0; j < snum; j++)
{
cout << "\t学生姓名:" << tArray[i].sArray[j].sname;
cout << " 成绩:" << tArray[i].sArray[j].score << endl;
}
cout << endl;
}
}
int main()
{
srand((unsigned int)time(NULL));
//1.创建三个老师
struct Teacher tArray[3];
int len = sizeof(tArray) / sizeof(tArray[0]);
//2.给三个老师赋值
createTeacher(tArray, len,5);
//3.显示成员
printTeacher(tArray, len,5);
return 0;
}