C++结构体详解:定义、使用与传参方式

Leo
Leo
发布时间:2026-10-16| 3人浏览过
原创

本文深入解析C++结构体的实际应用,从基础定义到高级用法,全面介绍结构体变量的三种创建方式、数组操作、指针访问以及作为函数参数时的值传递、地址传递与const修饰场景,助力提升代码封装性与执行效率。

结构体的定义与基本概念

在C++中,结构体(struct)是一种自定义的数据类型,允许将多个不同类型的数据组合在一起,形成一个逻辑整体。这是实现数据封装的基础手段。以下是一个包含姓名、年龄和分数的学生结构体定义示例:

struct Student {
    string name;
    int age;
    int score;
};

结构体变量的创建方式

定义结构体后,可以通过以下三种常见方式创建具体变量并赋值,开发者可根据实际需求选择最合适的写法。

第1步:分别声明与赋值

目的:先声明结构体变量,再逐一对成员进行修改。这种方式灵活,适合动态赋值。

struct Student s1;
s1.name = "张三";
s1.age = 18;
s1.score = 90;

第2步:初始化列表赋值

目的:在声明变量的同时,使用花括号提供初始值。这种方式简洁,适用于已知固定数据的场景。

struct Student s1 = {"李四", 19, 80};

第3步:定义时直接实例化

目的:在结构体定义语句末尾直接指定变量名,一步完成类型定义与变量创建。后续可继续对该变量进行赋值。

struct Student {
    string name;
    int age;
    int score;
}s3;

s3.name = "王五";
s3.age = 18;
s3.score = 89;

结构体数组的操作

当需要存储多条同类记录时,可以使用结构体数组。数组不仅方便批量初始化,还适合配合循环进行遍历处理。

第1步:初始化结构体数组

入口:声明数组的同时提供嵌套的花括号初始值列表。

struct Student stuArray[3] = {
    {"张三", 20, 92},
    {"李四", 18, 89},
    {"王五", 24, 95}
};

第2步:修改单个元素

动作:通过索引定位到具体元素,并修改其成员属性。例如将第三个学生的姓名改为“赵六”:

stuArray[2].name = "赵六";

第3步:遍历输出

结果:利用for循环遍历数组,依次打印每个结构体成员的详细信息。

for(int i = 0; i < 3; i++) {
    cout << "姓名:" << stuArray[i].name
         << "年龄:" << stuArray[i].age
         << "分数:" << stuArray[i].score << endl;
}

结构体指针的使用

通过结构体指针访问成员,可以减少内存拷贝开销,尤其在处理大型结构体时更为高效。主要操作符为>,用于替代点操作符访问指向对象的成员。

第1步:建立指针关联

入口:获取结构体变量的地址并赋值给同类型的指针变量。

struct Student s = {"张三", 18, 90};
struct Student *p = &s;

第2步:通过指针访问数据

动作:使用p->成员名的方式读取或修改数据。

cout << "姓名:" << p->name << endl;

结构体嵌套应用

在实际业务中,复杂对象往往由其他结构体组成。例如,teacher结构中嵌套了student结构,体现了层级关系。注意:原文示例中String应为标准库中的string(需包含头文件),此处按标准C++语法修正。

第1步:定义嵌套结构

准备条件:student结构必须先于teacher结构定义,或提前声明。teacher中包含一个student类型的成员。

struct student {
    string name;
    int age;
    int score;
};

struct teacher {
    int id;
    string name;
    int age;
    struct student stu;
};

第2步:访问嵌套成员

动作:使用连续的点操作符访问深层成员。

teacher t;
// 假设t.stu已赋值
t.stu.name;

结构体作为函数参数的传递方式

将结构体传递给函数时,主要有值传递和地址传递两种方式,选择合适的传递方式对性能和安全至关重要。

第1步:值传递(Value Passing)

目的:函数内部获得的是结构体的一份副本,修改不会影响原变量。适合小型结构体且无需修改原数据的场景。

void printStudent(struct Student s1) {
    cout << "姓名:" << s1.name
         << "年龄:" << s1.age
         << "分数:" << s1.score << endl;
}

int main() {
    struct Student s1;
    s1.name = "张三";
    s1.age = 18;
    s1.score = 95;
    printStudent(s1);
}

第2步:地址传递(Address Passing)

目的:传递结构体的地址,函数内通过指针访问原始数据,避免拷贝开销。但需注意指针参数可能导致原数据被意外修改。

void printStudent(struct Student *s1) {
    // 原文示例中使用变量名p,此处修正为参数名s1保持一致性
    cout << "姓名:" << s1->name
         << "年龄:" << s1->age
         << "分数:" << s1->score << endl;
}

int main() {
    struct Student s1;
    s1.name = "张三";
    s1.age = 18;
    s1.score = 95;
    printStudent(&s1);
}

第3步:常指针传递(const Pointer Passing)

目的:结合地址传递的高效性与const的安全性。确保函数内无法通过该指针修改原结构体数据,是推荐的只读访问方式。

void printStudent(const Student *s1) {
    // 原文示例中使用变量名p,此处修正为参数名s1保持一致性
    cout << "姓名:" << s1->name
         << "年龄:" << s1->age
         << "分数:" << s1->score << endl;
}

int main() {
    struct Student s1;
    s1.name = "张三";
    s1.age = 18;
    s1.score = 95;
    printStudent(&s1);
}

总结

掌握C++结构体的定义、变量创建、数组操作、指针访问及函数传参机制,是编写高效、模块化代码的关键。在实际开发中,建议优先使用地址传递配合const修饰,以兼顾性能与数据安全性。以上就是C++结构体详解的详细内容,更多关于C++基础数据结构的学习资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。