C++结构体用法详解(附带实例)
在 C++ 中,结构体可以将不同的数据类型组合在一起,形成一个新的数据类型。结构体类型是对数据的整合,可使代码更加简洁。
整型、字符型、浮点型都属于基本数据类型,只能记录单一的数据。如果要描述一个人,通常需要定义身高、体重、姓名、性别、年龄等多个不同类型的变量,非常麻烦。如果有一种类型可将这些变量组合在一起,则会大大减少程序代码的离散性。结构体就是实现这一功能的类型。
结构体是一种构造类型,其定义形式如下:
例如,定义一个员工信息结构体,代码如下:
1) 先定义结构体类型,再声明结构体变量。例如:
2) 定义结构体类型的同时声明结构体变量。例如:
3) 省略结构体类型名,直接声明结构体类型变量。例如:
4) 结构体变量可以在声明时直接进行初始化赋值。例如:
【实例】展示一位老师的基本信息。定义一个表示老师的结构体,结构体的成员有姓名、年龄、教龄;使用该结构体定义一位老师,并赋值,再输出。
例如,下面的代码在定义 PersonInfo 结构体后,声明了一个 pPersonInfo 指针变量:
【实例】输出新来学生信息。使用结构体指针变量引用结构体成员。输出学生信息,具体代码如下:
注意,不能直接将结构体变量作为一个整体进行输入和输出。例如,不能将 fruit 进行以下输出:
1) 在结构体中嵌套其他已定义好的结构体变量,例如:
2) 在结构体中定义子结构体,例如:
【实例】展示房间位置。使用嵌套的结构体,具体代码如下:
例如,有以下结构体定义:
所以 PersonInfo 结构体的大小是 30+4+2=36 字节。
可以使用 sizeof 运算符计算结构体的大小。例如:
整型、字符型、浮点型都属于基本数据类型,只能记录单一的数据。如果要描述一个人,通常需要定义身高、体重、姓名、性别、年龄等多个不同类型的变量,非常麻烦。如果有一种类型可将这些变量组合在一起,则会大大减少程序代码的离散性。结构体就是实现这一功能的类型。
结构体是一种构造类型,其定义形式如下:
struct 结构体类型名 { 成员类型 1 成员名 1; 成员类型 2 成员名 2; … 成员类型 n 成员名 n; };
- struct 是定义结构体的关键字;
- 结构体类型名是一个标识符,后续可用它定义结构体变量;
- 大括号内是结构体成员,每个成员都有独自的类型,可以是基本数据类型、自定义类型或类类型。
例如,定义一个员工信息结构体,代码如下:
struct PersonInfo //定义结构体类型 PersonInfo,包含 3 个成员 { int index; char name[30]; short age; };上述定义中,结构体类型名是 PersonInfo,结构体中定义了 3 个不同类型的变量 index、name 和 age,分别表示员工编号、姓名和年龄。
结构体是由多个不同类型的数据组成的数据集合,而数组是由相同类型元素组成的数据集合。
C++结构体变量的声明和初始化
定义了结构体后,结构体就成为一种新的数据类型,使用它可以定义结构体变量。1) 先定义结构体类型,再声明结构体变量。例如:
struct PersonInfo //定义结构体类型 PersonInfo { int index; char name[30]; short age; }; PersonInfo pinfo; //声明结构体变量 pinfo
2) 定义结构体类型的同时声明结构体变量。例如:
struct PersonInfo //定义结构体类型 PersonInfo { int index; char name[30]; short age; } pinfo1, pinfo2; //同时声明结构体变量 pinfo1 和 pinfo2
3) 省略结构体类型名,直接声明结构体类型变量。例如:
struct //省略结构体类型名 { int index; char name[30]; short age; } pinfo1, pinfo2; //直接声明两个结构体变量
4) 结构体变量可以在声明时直接进行初始化赋值。例如:
struct PersonInfo //定义结构体类型 PersonInfo { int index; char name[30]; short age; } pinfo={10,"张三",3}; //声明结构体变量 pinfo 的同时进行初始化赋值
C++结构体成员的引用
引用结构体成员有两种方式,分别是使用成员运算符“.”和使用指向运算符“->”。1) 使用成员运算符“.”
使用成员运算符“.”可以引用结构体的成员变量,一般形式如下:结构体变量名.成员名“.”在所有的运算符中优先级最高。例如,定义 PersonInfo 结构体后,可以通过 pInfo.index、pInfo.name、pInfo.age 引用其 3 个成员并进行初始化赋值。结构体成员的使用方式和普通变量完全一样。
【实例】展示一位老师的基本信息。定义一个表示老师的结构体,结构体的成员有姓名、年龄、教龄;使用该结构体定义一位老师,并赋值,再输出。
#include <iostream> #include <cstring> using namespace std; struct PersonInfo { int index; char name[30]; short age; } pinfo; int main() { pinfo.index=10; strcpy(pinfo.name,"张三"); pinfo.age=35; cout<<"教龄:"<< pinfo.index << endl; cout<<"姓名:"<< pinfo.name << endl; cout<<"年龄:"<< pinfo.age << endl; }程序运行结果为:
教龄:10
姓名:张三
年龄:35
注意,并不是所有的结构体成员都可以赋值,如果某个结构体变量的某个成员使用 const 限定,就不能对它赋值。
2) 使用指向运算符“->”
使用结构体,还可以定义指针变量,让一个指针指向该结构体。此时,该结构体成员的引用需要使用指向运算符“->”,一般形式如下:结构体指针变量->成员名
例如,下面的代码在定义 PersonInfo 结构体后,声明了一个 pPersonInfo 指针变量:
struct PersonInfo { int index; char name[30]; short age; } *pPersonInfo;使用 pPersonInfo->index、pPersonInfo->name、pPersonInfo->age 可以引用 pPersonInfo 的 3 个成员。
注意,结构体指针变量只有初始化后才能引用。
【实例】输出新来学生信息。使用结构体指针变量引用结构体成员。输出学生信息,具体代码如下:
#include <iostream> using namespace std; struct PersonInfo { int index; char name[30]; short age; } *pPersonInfo, pinfo={6,"小明",13}; int main() { pPersonInfo=&pinfo; cout << "年级" << pPersonInfo->index << endl; cout << "名字" << pPersonInfo->name << endl; cout << "年龄" << pPersonInfo->age << endl; }运行结果为:
年级6
名字小明
年龄13
注意,不能直接将结构体变量作为一个整体进行输入和输出。例如,不能将 fruit 进行以下输出:
printf("%s%s%s%d%s",fruit);
C++结构体的嵌套
定义结构体后,就会得到一种新的数据类型。为了提升效率,C++ 中允许在结构体定义中嵌套其他已定义好的结构体变量,或者在结构体定义中直接定义子结构体。1) 在结构体中嵌套其他已定义好的结构体变量,例如:
struct WorkPlace { char Address[150]; char PostCode[30]; char GateCode[50]; char Street[100]; char Area[50]; }; struct PersonInfo { int index; char name[30]; short age; WorkPlace myWorkPlace; };
2) 在结构体中定义子结构体,例如:
struct PersonInfo { int index; char name[30]; short age; struct WorkPlace { char Address[150]; char PostCode[30]; char GateCode[50]; char Street[100]; char Area[50]; } WP; };
【实例】展示房间位置。使用嵌套的结构体,具体代码如下:
#include <iostream> #include <cstring> using namespace std; struct PersonInfo { int index; char name[30]; short age; struct WorkPlace { char Address[150]; char PostCode[30]; char GateCode[50]; char Street[100]; char Area[50]; } WP; }; int main() { PersonInfo pInfo; strcpy(pInfo.WP.Address,"House"); strcpy(pInfo.WP.PostCode,"10000"); strcpy(pInfo.WP.GateCode,"302"); strcpy(pInfo.WP.Street,"Lan Tian"); strcpy(pInfo.WP.Area,"china"); cout << pInfo.WP.Address << endl; cout << pInfo.WP.PostCode << endl; cout << pInfo.WP.GateCode << endl; cout << pInfo.WP.Street << endl; cout << pInfo.WP.Area << endl; }程序运行结果为:
House
10000
302
Lan Tian
china
C++结构体的大小
结构体是一种构造数据类型,在没有字符对齐要求或结构体成员对齐单位为 1 时,结构体变量的大小是定义结构体时各成员的大小之和。例如,有以下结构体定义:
struct PersonInfo { int index; char name[30]; short age; };
- PersonInfo 结构体的大小是 3 个成员 name、index 和 age 的大小之和:
- name 是字符数组,一个字符占用 1 个字节,name 占用 30 个字节;
- index 是整型数据,在 32 位系统中占用 4 个字节;
- age 是短整型,在 32 位系统中占用 2 个字节。
所以 PersonInfo 结构体的大小是 30+4+2=36 字节。
可以使用 sizeof 运算符计算结构体的大小。例如:
#include <iostream> using namespace std; int main() { struct PersonInfo { int index; char name[30]; short age; }pInfo; cout << sizeof(pInfo) << endl; }运行结果为:
36
程序使用 sizeof 运算符输出的结果仍然是 36 个字节。