8.结构体
8.1基本概念
结构体是用户自定义的数据类型,允许用户存储不同的数据类型。
一些数据类型的集合组成的类型。
8.2结构体的定义和使用
语法: struct 结构体名{ 结构体成员列表 };(在main函数外定义嗷)
struct Student { string name ; int age ; }
创建变量:(这里的struct可以省略)
(1)struct 结构体名 变量名
struct Student s1;
s1 . name="张三";
s1 . age=22;
(2)struct 结构体名 变量名= { 成员1值,成员2值...}
struct Student s1 = { " 张三 ” ,22 };
(3)定义结构体时顺便创建变量
struct 结构体名{ 结构体成员列表 } s3;在这里创建变量
8.3结构体数组
将自定义的结构体放入数组中方便维护。
语法:struct 结构体名 数组名[ 元素个数 ] = { { } ,{ } ,....}
//创建结构体数组
struct student stuArray[3] =
{
{"丞哥", 18, 85},
{"李四", 19, 80},
{"成歌", 22, 90}
};
//给结构体数组中的元素赋值
stuArray[1].name = "蛋蛋";
stuArray[1].age = 22;
stuArray[1].score = 395;
//遍历结构体数组
for (int i = 0; i < 3; i++)
{
cout << "名字是" << stuArray[i].name
<< " 年龄是" << stuArray[i].age
<< " 成绩是" << stuArray[i].score;
cout << endl;
}
8.4结构体指针
作用:通过指针访问结构体中的成员
利用操作符 -> 就可以通过结构体指针访问结构体的成员属性
//创建结构体变量
struct student s ={"丞哥", 18, 85};
//通过指针指向结构体变量
struct student*p = &s;
//通过指针访问结构体变量中的数据
cout<<"姓名:" << p->name << endl;
cout << "年龄:" << p->age << endl;
cout << "成绩:" << p->score << endl;
8.5结构体嵌套结构体
作用:结构体成员可以是另一个结构体
struct student
{
string name;
int age;
int score;
};
struct teacher
{
int id;
string name;
struct student stu;//这里就定义了一个学生变量
};
int main()
{
//创建老师
teacher t;
t.id = 10000;
t.name = "丞哥";
t.stu.name = "蛋蛋";
t.stu.score = 395;
cout << "老师的名字是"<<t.name << endl;
cout << "学生的名字是" << t.stu.name << endl;
cout << "学生的成绩为" << t.stu.score << endl;
8.6结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式: 值传递 地址传递
void printStudent1(struct student s)
{
s.age = 23;
cout << "子函数中的 姓名:" << s.name << " 年龄" << s.age << " 成绩" << s.score << endl;
}
void printStudent2(struct student *s)
{
s->age = 24;
cout << "子函数2中的 姓名:" << s->name << " 年龄" << s->age << " 成绩" << s->score << endl;
}
int main()
{
//创建一个结构体变量
student s = { "丞哥",22,85 };
printStudent1(s);
printStudent2(&s);//指针后把实参的值也更改了
cout << "main函数中的 姓名:" << s.name << " 年龄" << s.age << " 成绩" << s.score << endl;
8.7结构体中const使用场景
作用:用const来防止在函数内误操作
将函数中的形参改成指针,可以减少内存空间,而且不会复制新的副本出来。
在形参前加一个const 就不会在函数中更改实参的值了。
void printstudent (const student *s)
8.8结构体案例
struct student
{
string name;
int score;
};
struct teacher
{
string name;
struct student arr2[5];
};
void allocateSpace(struct teacher arr1[], int len)
{
for (int i = 0; i < len; i++)
{
string nameSeed = "ABCDE";
arr1[i].name = "teacher_";
arr1[i].name += nameSeed[i];//追加字母 (?我不理解,字符还能这样加)
for (int j = 0; j < 5; j++)//通过循环给每名老师的学生赋值
{
arr1[i].arr2[j].name = "student_";
arr1[i].arr2[j].name += nameSeed[j];
int random = rand() % 61 + 40;//0~59+40=40~100
arr1[i].arr2[j].score = random;
}
}
}
void printInfo(struct teacher arr1[],int len)
{
for (int i = 0; i < len; i++)
{
cout << "老师的姓名: " << arr1[i].name << endl;
for (int j = 0; j < 5; j++)
{
cout << "学生的名字: " << arr1[i].arr2[j].name
<< "该学生的成绩: " << arr1[i].arr2[j].score << endl;
}
}
}
int main()
{
//随机数种子
srand((unsigned int)time(NULL));
//创建老师的数组
struct teacher arr1[3];
//通过函数给3名老师的信息赋值,并给老师所带学生赋值
int len = sizeof(arr1) / sizeof(arr1[0]);
//创建学生的数组
struct student arr2[5];
allocateSpace(arr1, len);
printInfo(arr1, len);
system("pause");
return 0;
}
8.8.2结构体案例2
struct hero
{
string name;
int age;
string sex;
};
void bubblesort(struct hero arr[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
//int temp = 0;
if (arr[j].age > arr[j + 1].age)
{
struct hero temp = arr[j];//这里记录的是一个数组里面的全部变量,
不然人和名字对不上
temp.age = arr[j].age;
arr[j]= arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printHero(struct hero arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "英雄的名字是: " << arr[i].name <<
" 年龄是:" << arr[i].age <<
" 性别是:" << arr[i].sex << endl;
}
}
int main()
{
struct hero arr[5]
{
{ "刘备",23,"男" },
{ "关羽",22,"男" },
{ "张飞",20,"男" },
{ "赵云",21,"男" },
{ "貂蝉",19,"女" }
};
int len = sizeof(arr) / sizeof(arr[0]);
bubblesort(arr, len);
printHero(arr, len);
system("pause");
return 0;
}