C++结构体

结构体是用户自定义的数据类型,目的是用于存储不同类型的数据项,可用于存储多种类型的数据记录。

  1. 结构体的定义

结构体以struct关键字起始,后接结构体变量名和以数据成员组成的声明语句:

struct type_name
{
	member_type1 member_name1;
	member_type2 member_name2;
	member_type3 member_name3;
}obj_name1, obj_name2;

obj_name1, obj_name2是在结构体定义时声明的两个struct type_name类型的两个变量。也可以先定义再声明,使用
struct type_name obj_name 格式声明结构体对象。

1.1 结构体定义实例

以存储老师信息为例,定义Teacher结构体:

struct Teacher
{
	char name[64];
	int age;
	char subject[64];
	char classes[10];
}teacher1, teacher2;

如上,我们定义了Teacher结构体。以struct关键字开始,后接结构体类型名称Teacher,花括号内声明基本的数据类型,第一个是字符串(字符数组)类型的name变量,第二个变量是int类型的age,第三个是字符数组类型的subject,第四个是字符数组类型的class;紧接着我们在定义阶段就声明了两个struct Teacher的变量teacher1和teacher2。我们在之后根据需求还可以声明该类型的变量,如:struct Teacher t3, t4;(其中struct在c++中可以省略, c中不可以)。

除此之外还有匿名结构体的定义和使用。将上面的Teacher去掉就是匿名结构体的定义:

struct
{
	char name[64];
	int age;
	char subject[64];
	char classes[10];
}teacher1, teacher2;

匿名结构体必须在定义的时候就把变量声明好,否则以后无法使用该结构体,因为无法知道该类型的类型名。这种结构体一般很少使用。

  1. 访问结构体成员

我们定义自己所需要的数据类型,在声明一个这种类型的变量后通常需要初始化或赋值,例如,基本数据类型中有

int age;
age = 20;

这样就可以直接使用该变量了。同样,结构体也需要类似的操作,不过一般通过逐个给结构体中的成员赋值,这就涉及了如何
访问结构体成员的问题。

2.1 成员访问运算符访问

结构体成员的访问一般使用 var_name.member_name 的形式访问(. 被称为成员访问运算符),并通过var_name.member_name = member_data 的形式赋值。
以上面定义的teacher1变量为例,给teacher1结构体变量中的各个成员赋值:

strcpy(teacher1.name, "name1"); /** 将"name1"拷贝到teacher1.name */
teacher1.age = 21; /** teacher1.age 赋值为21 */
strcpy(teacher1.subject, "subject1"); /** 拷贝"subject1"到teacher1.subject
strcpy(teacher1.classes, "class1");

2.2 结构体指针访问

与基本数据类型类似,我们也可以定义指向结构体的指针,格式如下:

struct type_name *pvar_name; /** 定义指向type_name结构体类型的指针变量 */
pvar_name = &var_name; /** var_name 是type_name数据类型的一个变量 */

以上面的Teacher结构体数据类型为例:

Teacher t1; /** 声明一个Teacher类型的结构体变量t1 */
Teacher *pt1; // ** 声明指向Teacher类型的指针变量pt1 */
pt = &t1; // 将t1的地址赋值给指针变量

使用指向结构体变量的指针,我们就可以使用->运算符访问结构体成员:
与3.1中的例子类似:

/** 结构体成员的赋值 */
strcpy(pt1->name, "name1");
pt1->age = 21;
strcpy(pt1->subject, "subject");
strcpy(pt1->classes, "class1");
  1. 为结构体类型定义别名

我们可以使用typedef关键字为某种类型取一个别名,格式为 typedef type_name alias_name;
以Teacher结构体为例:

typedef struct Teacher
{
	char name[64];
    int age;
    char subject[64];
    char classes[10];
 }Teacher, *Pt;

我们定义了一个Teacher结构体类型Teacher和Teacher结构体指针类型Pt。
这样我们可以直接使用Teacher来定义teacher1变量, 加上struct不会通过编译:

Teacher teacher1; /** 不取别名c++中也可以这样定义变量*/
Pt pteacher; /** 定义一个指向结构的指针 */
  1. 结构体/结构体指针作为函数参数

某个定义好的结构体就是一种用户自定义的数据类型,它们在做函数参数时和基本的数据类型如int, long, char, char[]等没有区别。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring> 
using namespace std;

typedef struct _Teacher
{
	char name[64];
	int age;
	char subject[64];
	char classes[10];
}Teacher;

void printTeacher(Teacher teacher)
{
	cout << "teacher.name: " << teacher.name << endl;
	cout << "teacher.age: " << teacher.age << endl;
	cout << "teacher.subject: " << teacher.subject << endl;
	cout << "teacher.classes: " << teacher.classes << endl;
	cout << endl;
	return;
}

void printPTeacher(Teacher* pteacher)
{
	cout << "teacher.name: " << pteacher->name << endl;
	cout << "teacher.age: " << pteacher->age << endl;
	cout << "teacher.subject: " << pteacher->subject << endl;
	cout << "teacher.classes: " << pteacher->classes << endl;
	cout << endl;
	return;
}

int main()
{
    /** 使用时声明结构体变量 */
    Teacher teacher1, teacher2, teacher3, teacher4;
    strcpy(teacher1.name, "name1");
    teacher1.age = 21;
    strcpy(teacher1.subject, "subject1");
    strcpy(teacher1.classes, "class1");

	strcpy(teacher2.name, "name2");
	teacher2.age = 22;
	strcpy(teacher2.subject, "subject2");
	strcpy(teacher2.classes, "class2");

	strcpy(teacher3.name, "name3");
	teacher3.age = 23;
	strcpy(teacher3.subject, "subject3");
	strcpy(teacher3.classes, "class3");

	strcpy(teacher4.name, "name4");
	teacher4.age = 24;
	strcpy(teacher4.subject, "subject4");
	strcpy(teacher4.classes, "class4");

	printTeacher(teacher1);
	printTeacher(teacher3);

	printPTeacher(&teacher1);
	printPTeacher(&teacher3);

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值