结构体是用户自定义的数据类型,目的是用于存储不同类型的数据项,可用于存储多种类型的数据记录。
- 结构体的定义
结构体以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;
匿名结构体必须在定义的时候就把变量声明好,否则以后无法使用该结构体,因为无法知道该类型的类型名。这种结构体一般很少使用。
- 访问结构体成员
我们定义自己所需要的数据类型,在声明一个这种类型的变量后通常需要初始化或赋值,例如,基本数据类型中有
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");
- 为结构体类型定义别名
我们可以使用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; /** 定义一个指向结构的指针 */
- 结构体/结构体指针作为函数参数
某个定义好的结构体就是一种用户自定义的数据类型,它们在做函数参数时和基本的数据类型如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;
}