C++基础篇(四)结构体及示例

一、结构体的定义和使用

1、定义

结构体是用户根据需求自定义的数据类型,允许用户储存基本数据类型之外的数据,
结构体是C++中一种复合数据类型,它允许将多个不同类型的变量组合在一起。结构体通常用来表示一组相关的数据。

结构体的定义通常遵循以下格式:

struct StructName {
    DataType1 member1;
    DataType2 member2;
    ...
    DataTypeN memberN;
};

其中,StructName是结构体的名称,DataType是成员的数据类型,member是成员的名称。
示例:

struct Student {
    string name;
    int age;
    double gpa;
};

在上面的代码中,定义了一个名为Student的结构体。这个结构体包含三个成员:name、age和gpa。它们分别表示学生的姓名、年龄和平均成绩。

2、基本使用

要使用一个结构体,需要先声明一个结构体变量。结构体变量的声明通常遵循以下格式:

StructName variableName;

其中,StructName是结构体的名称,variableName是变量的名称。

例如,下面是一个简单的结构体变量声明的例子:

Student s;//声明了一个Student类型的变量s

接下来,可以使用点运算符.来访问和修改结构体变量中的成员。

s.name = "Alice";
s.age = 20;
s.gpa = 3.9;
cout << s.name << " " << s.age << " " << s.gpa << endl; // 输出Alice 20 3.9

二、其他应用

1、结构体数组

使用数组来存储多个结构体的信息:

   // 定义一个数组来存储3个学生的信息
    Student students[3] = {
        {"张三", 18, 90.5},
        {"李四", 19, 85.0},
        {"王五", 20, 95.5}
    };

计算平均成绩:

 // 计算平均成绩
    float sum = 0;
    for (int i = 0; i < 3; i++) {
        sum += students[i].score;
    }
    float average = sum / 3;

2、结构体指针

结构体指针是指向结构体的指针,通过指针来访问结构体中的数据成员。

 // 定义一个学生结构体
    Student stu = {"张三", 18, 90.5};

    // 定义一个指向学生结构体的指针
    Student *pStu = &stu;

    // 使用指针访问和修改结构体中的数据
    cout << "姓名:" << pStu->name << endl;
    cout << "年龄:" << pStu->age << endl;
    cout << "成绩:" << pStu->score << endl;

    pStu->score = 95.0;
    cout << "修改后的成绩:" << pStu->score << endl;

-> 运算符相当于解引用指针后再使用 . 运算符来访问成员

Student *pStu = ...; // 指向一个 Student 结构体的指针
cout << pStu->name; // 访问 name 成员

等价于:

Student *pStu = ...; // 指向一个 Student 结构体的指针
cout << (*pStu).name; // 解引用指针后再使用 . 运算符访问 name 成员

3、结构体嵌套结构体

结构体可以嵌套定义,即一个结构体中可以包含另一个结构体作为它的成员。

// 定义一个结构体表示学生的地址信息
struct Address {
    string city; // 城市
    string street; // 街道
    int zip; // 邮编
};

// 定义一个结构体表示学生信息
struct Student {
    string name; // 姓名
    int age; // 年龄
    float score; // 成绩
    struct Address address; // 地址信息
};

使用和访问:

 // 定义一个学生结构体
    Student stu = {"张三", 18, 90.5, {"北京", "长安街", 100000}};

    // 访问学生的地址信息
    cout << "城市:" << stu.address.city << endl;
    cout << "街道:" << stu.address.street << endl;
    cout << "邮编:" << stu.address.zip << endl;

Student 结构体中还包含一个 address 成员,它是一个 Address 类型的结构体,用来存储学生的地址信息。

4、结构体作为函数参数

作为函数参数,可以通过值传递和地址传递。
值传递函数定义:

// 定义一个函数,使用值传递的方式接收结构体参数
void printStudent1(Student stu) {
    cout << "使用值传递:" << endl;
    cout << "姓名:" << stu.name << endl;
    cout << "年龄:" << stu.age << endl;
    cout << "成绩:" << stu.score << endl;
}

地址传递函数定义:

// 定义一个函数,使用地址传递的方式接收结构体参数
void printStudent2(Student *pStu) {
    cout << "使用地址传递:" << endl;
    cout << "姓名:" << pStu->name << endl;
    cout << "年龄:" << pStu->age << endl;
    cout << "成绩:" << pStu->score << endl;
}

使用:

 // 定义一个学生结构体
    Student stu = {"张三", 18, 90.5};

    // 调用函数打印学生信息
    printStudent1(stu);
    printStudent2(&stu);

5、结构体中const的使用

const 关键字可以用来修饰结构体的成员变量,表示该成员变量的值是不可修改的。这样就可以保证结构体中某些数据的不变性,提高程序的可靠性和安全性。

#include <iostream>
#include <string>
using namespace std;

// 定义一个结构体表示学生信息
struct Student {
    const string name; // 姓名(不可修改)
    int age; // 年龄
    float score; // 成绩
};

int main() {
    // 定义一个学生结构体
    Student stu = {"张三", 18, 90.5};

    // 尝试修改学生的姓名(会编译错误)
    // stu.name = "李四";

    return 0;
}

除了在定义结构体时使用 const 关键字修饰成员变量外,我们还可以在定义结构体指针时使用 const 关键字。例如:

Student stu = {"张三", 18, 90.5};
const Student *pStu = &stu;

上面的代码定义了一个指向 Student 类型的指针 pStu,并使用 const 关键字修饰,也叫常量指针。这表示不能通过 pStu 指针来修改它所指向的结构体的值。因此,下面的代码会发生编译错误:

pStu->age = 20; // 编译错误

更多指针的用法以及指针和const的使用详见博客C++基础篇(三)指针详解与示例

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值