结构体

结构体

  • 结构体的定义与使用
  • 结构体数组
  • 结构体指针
  • 结构体嵌套结构体
  • 结构体作为函数参数

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

结构体的定义与使用

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

结构体的定义:

#include 

// 自定义student类型
struct student
{
	std::string name;
	int age;
	int score;
};

int main(){
	system("pause");
	
	return 0;
}

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

  • struct 结构体名 变量名;
  • struct 结构体名 变量名 = {成员1, 成员2, …};
  • 定义结构体时,同时创建变量

创建结构体变量 —— 方式一:

#include 

// 自定义student类型
struct student
{
	std::string name;
	int age;
	int score;
};

int main(){
	struct student s1;  // 创建student结构体的变量s1,此处的struct关键字可以省略
	s1.name = "张三";  // 通过 "." 来访问结构体变量中的属性
	s1.age = 18;
	s1.score = 90;
	
	std::cout << "姓名:" << s1.name << std::endl;
	std::cout << "年龄:" << s1.age << std::endl;
	std::cout << "分数:" << s1.score << std::endl;
	
	system("pause");
	
	return 0;
}
---------
姓名:张三
年龄:18
分数:90

创建结构体变量 —— 方式二:

#include 

// 自定义student类型
struct student
{
	std::string name;
	int age;
	int score;
};

int main(){
	struct student s1 = {"李四", 20, 85};
	
	std::cout << "姓名:" << s1.name << std::endl;
	std::cout << "年龄:" << s1.age << std::endl;
	std::cout << "分数:" << s1.score << std::endl;
	
	system("pause");
	
	return 0;
}
---------
姓名:李四
年龄:20
分数:85

创建结构体变量 —— 方式三:

#include 

// 自定义student类型
struct student
{
	std::string name;
	int age;
	int score;
}s1;  // 在定义结构体时,同时创建变量

int main(){
	s1.name = "王五";
	s1.age = 25;
	s1.score = 99;
	
	std::cout << "姓名:" << s1.name << std::endl;
	std::cout << "年龄:" << s1.age << std::endl;
	std::cout << "分数:" << s1.score << std::endl;
	
	system("pause");
	
	return 0;
}
---------
姓名:王五
年龄:25
分数:99

小结: 在定义结构体时,struct关键字不能省略,而在创建结构体变量时则可以省略;前两种创建结构体变量的方式较为常用。

结构体数组

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

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

#include 

// 自定义student类型
struct student
{
	std::string name;
	int age;
	int score;
};

int main(){
	// 结构体数组
	struct student arr[3] = {
		{"张三", 18, 90},
		{"李四", 20, 85},
		{"王五", 25, 99}
	};
	
	// 修改结构体数组的元素
	arr[2].name = "赵六";
	arr[2].age = 30;
	arr[2].score = 100;
	
	for (int i = 0; i < 3; i++){
		std::cout << "姓名:" << arr[i].name << "   " 
				  << "年龄:" << arr[i].age << "   " 
				  << "分数:" << arr[i].score << std::endl;
	}
	
	system("pause");
	
	return 0;
}
---------
姓名:张三   年龄:18   分数:90
姓名:李四   年龄:20   分数:85
姓名:赵六   年龄:30   分数:100

结构体指针

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

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

#include 

// 自定义student类型
struct student
{
	std::string name;
	int age;
	int score;
};

int main(){
	// 创建结构体变量
	student s1 = {"张三", 18, 90};
	
	// 通过指针指向结构体变量
    student* p = &s1;
    
    // 通过指针访问结构体变量中的属性
    std::string name = p->name;
    int age = p->age;
    int score = p->score;
    
    std::cout << "姓名:" << name << "   " 
			  << "年龄:" << age << "   " 
			  << "分数:" << score << std::endl;
    
	system("pause");
	
	return 0;
}
---------
姓名:张三   年龄:18   分数:90

结构体嵌套结构体

作用: 将一个结构体作为另一个结构体中的成员,以解决实际问题

例如,一个老师辅导一个学生。

#include 

// 定义student结构体
struct student
{
	std::string name;
	int age;
	int score;
};

// 定义teacher结构体
struct teacher
{
    int id;
    std::string name;
    int age;
    student s1;  // student结构体变量
}

int main(){
	// 创建结构体变量
	teacher t1 = {1, "张三", 38, {"李四", 18, 90}};
    
    std::cout << "老师编号:" << t1.id << "   "
              << "老师姓名:" << t1.name << "   " 
			  << "老师年龄:" << t1.age << "   "
              << "学生姓名:" << t1.s1.name << "   "
              << "学生年龄:" << t1.s1.age << "   "
			  << "学生分数:" << t1.s1.score << std::endl;
    
	system("pause");
	
	return 0;
}
---------
老师编号:1   老师姓名:张三   老师年龄:38   学生姓名:李四   学生年龄:18   学生分数:90

结构体作为函数参数

传递方式有两种:

  • 值传递
  • 地址传递
#include 

// 定义student结构体
struct student
{
	std::string name;
	int age;
	int score;
};

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

// 地址传递
void printStudent2(student* p){
	p->age = 38;
	p->score = 59;
	
	std::cout << "姓名:" << p->name << "   "
              << "年龄:" << p->age << "   "
			  << "分数:" << p->score << std::endl;
}

int main(){
	// 创建结构体变量
	student s1 = {"张三", 18, 90};
    
    std::cout << "姓名:" << s1.name << "   "
              << "年龄:" << s1.age << "   "
			  << "分数:" << s1.score << std::endl;
			  
	printStudent1(s1);  // 值传递,改变形参不会影响实参
	
	std::cout << "姓名:" << s1.name << "   "
              << "年龄:" << s1.age << "   "
			  << "分数:" << s1.score << std::endl;
			  
	printStudent2(&s1);  // 地址传递,改变形参会影响实参
	
	std::cout << "姓名:" << s1.name << "   "
              << "年龄:" << s1.age << "   "
			  << "分数:" << s1.score << std::endl;
    
	system("pause");
	
	return 0;
}
---------
姓名:张三   年龄:18   分数:90
姓名:张三   年龄:28   分数:60
姓名:张三   年龄:18   分数:90
姓名:张三   年龄:38   分数:59
姓名:张三   年龄:38   分数:59

你可能感兴趣的:(C++,算法,数据结构,c++)