9、结构体

结构体基本概念

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

结构体定义和使用

语法struct 结构体名 { 结构体成员列表 };

通过结构体创建变量的方式有三种:

创建结构体变量

创建结构体变量、结构体变量指针、结构体数组,struct可以进行省略

方式一

#include<iostream>
using namespace std;
#include<string>

struct student {
	string name;
	int age;
	string idCard;
};

int main() {
	struct student st1;
	st1.age = 18;
	st1.idCard = "abcdefg";
	st1.name = "lucy";
	cout << "name=" << st1.name << ",age=" << st1.age << ",idCard=" << st1.idCard << endl;
	system("pause");
	return 0;
}

方式二

#include<iostream>
using namespace std;
#include<string>

struct student {
	string name;
	int age;
	string idCard;
};

int main() {
	struct student st1 = { "lucy",18,"abcdef" };

	cout << "name=" << st1.name << ",age=" << st1.age << ",idCard=" << st1.idCard << endl;
	system("pause");
	return 0;
}

方式三

#include<iostream>
using namespace std;
#include<string>

struct student {
	string name;
	int age;
	string idCard;
}st1;

int main() {

	st1 = { "lucy",18,"abcdef" };

	cout << "name=" << st1.name << ",age=" << st1.age << ",idCard=" << st1.idCard << endl;
	system("pause");
	return 0;
}

结构体数组

作用:将自定义的结构体放入到数组中方便维护

语法 struct 结构体名 数组名[元素个数] = { {} , {} , ... {} }

例子:

#include<iostream>
using namespace std;
#include<string>

struct student {
	string name;
	int age;
	string idCard;
};

int main() {
	//第一种定义方式
	student stus[3];
	stus[0] = { "lucy",18,"absgdd" };
	stus[1] = { "tom",25,"sgsg" };
	stus[2] = { "james",69,"sdhfso" };
	//第二种定义方式
	student stus1[2] = { {"lily",28,"sgsd"},{"kobe",22,"sojf"} };
	system("pause");
	return 0;
}

结构体指针

作用:通过指针访问结构体中的成员

利用操作符 -> 可以通过结构体指针访问结构体属性

例子:

#include<iostream>
using namespace std;
#include<string>
//定义学生结构体
struct student {
	string name;
	int age;
	string idCard;
};

int main() {
    //创建学生结构体变量
	student stu = { "lucy",18,"sofof" };
    //通过指针指向结构体变量,其中这个struct可以省略
	 student * p = &stu;
	//通过操作符->访问结构体变量中的数据
	cout << p->age << p->name << p->idCard << endl;
	system("pause");
	return 0;
}

嵌套结构体

作用: 结构体中的成员可以是另一个结构体

例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

示例

//学生结构体定义
struct student
{
    //成员列表
    string name;  //姓名
    int age;      //年龄
    int score;    //分数
};

//教师结构体定义
struct teacher
{
    //成员列表
    int id; //职工编号
    string name;  //教师姓名
    int age;   //教师年龄
    struct student stu; //子结构体 学生
};


int main() {

    struct teacher t1;
    t1.id = 10000;
    t1.name = "老王";
    t1.age = 40;

    t1.stu.name = "张三";
    t1.stu.age = 18;
    t1.stu.score = 100;

    cout << "教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl;

    cout << "辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl;

    system("pause");

    return 0;
}

总结:在结构体中可以定义另一个结构体作为成员,用来解决实际问题

结构体做函数参数

作用:将结构体作为参数向函数中传递

传递方式有两种:

示例

//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//值传递
void printStudent(student stu )
{
	stu.age = 28;
	cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;
}

//地址传递
void printStudent2(student * stu)
{
	stu->age = 28;
	cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age  << " 分数:" << stu->score << endl;
}

int main() {

	student stu = { "张三",18,100};
	//值传递
	printStudent(stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;

	cout << endl;

	//地址传递
	printStudent2(&stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;

	system("pause");

	return 0;
}

总结:如果不想修改主函数中的数据,用值传递,反之用地址传递