精讲:结构体

大家好:

        衷心希望各位点赞。

        您的问题请留在评论区,我会及时回答。

一、结构体

        C语言中,结构体是用户根据实际问题而自行建立的一种数据类型,是由一系列相同或不同数据类型的数据构成的集合。在实际问题中,一个对象往往具有多个属性,需要一组不同类型的数据来表示。比如:手机通讯录中的一条记录应该包括编号、姓名、电话号码、性别、生日、地址等信息。显然单个基本数据类型或数组不能表达一条通讯记录,这时就需要用到结构体类型。结构体类型同C语言的基本数据类型一样,可以赋值、作为函数的参数、作为函数的返回值。

1、结构体定义

         结构体是由一个或多个变量组成的集合。这些变量称为结构成员,结构成员可以是相同类型,也可以是不同类型。结构体定义形式如下:

struct 结构体名
{
	数据类型 成员名;
	数据类型 成员名;
	数据类型 成员名;
	...
};

        结构体名是定义结构体数据类型的名字,在“{”和“}”之间的是结构体成员的列表,每一个结构体成员由一个数据类型和合法标识符组成。

        在程序中定义结构体时,需要注意结构体成员可以是另外一个结构体类型,比如:

struct Date
{
	int year;
	int month;
	int day;
};

struct Person
{
	string name;
	struct Date birthday;
};

2、结构体使用

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

struct 结构体名 变量名;
struct 结构体名 变量名 = { 成员1值, 成员2值...};
定义结构体时,顺便创建变量。
#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

//创建学生数据类型:结构成员包括姓名、年龄、分数
//struct关键字不可省略
struct Student 
{
	//成员列表
	string name;//姓名
	int age;//年龄
	int score;//分数
}s3;//定义结构体时,顺便创建结构体变量

int main(void) {

	//1、struct 结构体名 变量名;
	struct Student s1;
	//给s1的属性赋值
	s1.name = "张三";
	s1.age = 18;
	s1.score = 100;

	cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;


	//2、struct 结构体名 变量名 = { 成员1值, 成员2值... };
	struct Student s2 = { "李四", 17, 90 };

	cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;


	//3、定义结构体时,顺便创建结构体变量
	s3.name = "王五";
	s3.age = 16;
	s3.score = 80;
	
	cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;

	system("pause");
	return 0;
}

运行截图:

二、结构体数组

        结构体数组是具有相同结构体类型的变量的集合,可以用于存储和处理一批相同结构体类型的数据。结构体数组的每一个元素都是结构体类型数据,每一个元素都包括含该结构体类型的所有成员。

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

struct Student 
{
	//成员列表
	string name;//姓名
	int age;//年龄
	int score;//分数	
};
int main(void) {

	//创建结构体数组
	struct Student stuArray[3];
	stuArray[0] = { "张三", 18, 100 };
	stuArray[1] = { "李四", 17, 90 };
	stuArray[2] = { "王五", 16, 80 };
	
	for (int i = 0; i < 3; i++) {
		cout << "姓名:" << stuArray[i].name 
			 << " 年龄:" << stuArray[i].age 
			 << " 分数:" << stuArray[i].score << endl;
	}

	cout << "----------" << endl;

	//创建结构体数组,同时赋初值
	struct Student stuArray1[3] = {
		{ "小明", 8, 100 },
		{ "小军", 7, 90 },
		{ "小红", 6, 80 }
	};

	for (int i = 0; i < 3; i++) {
		cout << "姓名:" << stuArray1[i].name 
			 << " 年龄:" << stuArray1[i].age 
			 << " 分数:" << stuArray1[i].score << endl;
	}

	system("pause");
	return 0;
}

运行截图:

三、结构体指针

        作用:通过指针访问结构体中的成员,利用指向运算符‘ -> ’可以通过结构体指针访问结构体成员。

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

struct Student 
{
	//成员列表
	string name;//姓名
	int age;//年龄
	int score;//分数	
};
int main(void) {

	//创建结构体变量,并初始化
	struct Student stu = { "张三", 18, 100 };

	//创建结构体指针,并指向结构体变量
	struct Student* p = &stu;

	//结构体指针通过‘ -> ’访问成员
		cout << "姓名:" << p->name 
			 << " 年龄:" << p->age 
			 << " 分数:" << p->score << endl;

	system("pause");
	return 0;
}

运行截图:

 

四、结构体嵌套结构体

        定义:结构体中的成员可以是另外一个结构体。

        比如:每一个老师辅导一个学生,一个老师结构体中,记录一个学生结构体。

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

struct Student 
{
	//成员列表
	string name;//姓名
	int age;//年龄
	int score;//分数	
};

struct Teacher 
{
	int id; //教师编号
	string name;
	int age;
	struct Student stu; //辅导的学生
};

int main(void) {

	struct Teacher t1;
	
	t1.id = 1000;
	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;
}

运行截图:

 

五、结构体作函数参数

        像其他普通类型一样,结构体类型也可以作为函数的参数类型和函数的返回值类型,用结构体变量作为函数实参,与普通变量作为函数实参没有区别,都是传值调用。在函数内部对其操作,不会引起结构体各个成员值的变化。

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

        传递方式有两种:值传递、地址传递

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

struct Student 
{
	//成员列表
	string name;//姓名
	int age;//年龄
	int score;//分数	
};

struct Teacher 
{
	int id; //教师编号
	string name;
	int age;
	struct Student stu; //辅导的学生
};

void printTeacher(struct Teacher t);//值传递
void printStudent(struct Student* s);//地址传递


int main(void) {

	struct Teacher t1;

	struct Student s;
	
	t1.id = 1000;
	t1.name = "李老师";
	t1.age = 40;

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

	s.name = "李四";
	s.age = 17;
	s.score = 100;

	printTeacher(t1);

	printStudent(&s);

	system("pause");
	return 0;
}

void printTeacher(struct Teacher t) {
	cout << "教师 职工编号:" << t.id
		<< " 姓名:" << t.name
		<< " 年龄:" << t.age << endl;
}

void printStudent(struct Student* s) {
	cout << "学生 姓名:" << s->name
		<< " 年龄:" << s->age
		<< " 分数:" << s->score << endl;
}

运行截图:

六、结构体中const使用场景

        作用:使用 const 防止误操作。

        将函数中的形参改为指针,可以减少内存空间,这样不会复制新的副本出来。为了防止函数修改指针指向的数据,加上 const 修饰,防止误操作。

void printStudent(const struct Student* s) {

	s->name = 100;//报错,加入const,一旦有修改的操作就会报错,可以防止误操作

	cout << "学生 姓名:" << s->name
		<< " 年龄:" << s->age
		<< " 分数:" << s->score << endl;
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值