首页 > 编程笔记 > C++笔记 阅读:156

C++结构体用法详解(附带实例)

C++ 中,结构体可以将不同的数据类型组合在一起,形成一个新的数据类型。结构体类型是对数据的整合,可使代码更加简洁。

整型、字符型、浮点型都属于基本数据类型,只能记录单一的数据。如果要描述一个人,通常需要定义身高、体重、姓名、性别、年龄等多个不同类型的变量,非常麻烦。如果有一种类型可将这些变量组合在一起,则会大大减少程序代码的离散性。结构体就是实现这一功能的类型。

结构体是一种构造类型,其定义形式如下:
struct 结构体类型名
{
    成员类型 1 成员名 1;
    成员类型 2 成员名 2;
    …
    成员类型 n 成员名 n;
};

例如,定义一个员工信息结构体,代码如下:
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

程序分别引用结构体的每个成员,然后赋值,其中为字符串数组赋值需要使用 strcpy() 字符串复制函数。

注意,并不是所有的结构体成员都可以赋值,如果某个结构体变量的某个成员使用 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

程序在 PersonInfo 结构体中嵌套了 WorkPlace 结构体,然后分别对 WorkPlace 子结构体中的成员进行赋值,最后将 WorkPlace 子结构体中的成员输出。

C++结构体的大小

结构体是一种构造数据类型,在没有字符对齐要求或结构体成员对齐单位为 1 时,结构体变量的大小是定义结构体时各成员的大小之和。

例如,有以下结构体定义:
struct PersonInfo
{
    int index;
    char name[30];
    short age;
};

所以 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 个字节。

相关文章