当前位置: 首页 > news >正文

C++的结构体传参

前置知识

点运算符

  • 符号.
  • 用途:用于直接访问结构体或类对象的成员
  • 语法对象名.成员名
  • 解析过程:编译器在编译时就确切地知道对象在内存中的位置,以及每个成员相对于对象起始地址的偏移量。因此,对象名.成员名 是一种直接访问,编译器能够迅速找到并操作该成员。

箭头运算符

  • 符号->
  • 用途:用于通过指向结构体或类的指针来访问其成员。
  • 语法指针名->成员名
  • 解析过程->运算符是(*指针名).成员名语法糖(syntactic sugar)。它的操作分两步:
    1. 解引用:首先,它对指针进行解引用(*指针名),以获取指针所指向的实际对象。
    2. 成员访问:然后,它使用点运算符.,来访问该对象的成员。

点运算符和箭头运算符的总结

运算符用于语法行为
.对象(实体)对象名.成员名直接访问成员
->指针指针名->成员名解引用指针后访问成员

关键在于:是一个对象还是一个指向该对象的地址

 


 

指针传递(Pass by Pointer)

  • 方式: 将结构体的内存地址作为参数,传入函数。

  • 格式: void func(Book* b)

  • 特点:

    • 高效: 传递的只是一个指针(通常只有 4 或 8 个字节),而不是整个结构体。这大大减少了内存开销和复制时间,与结构体的大小无关。
    • 可修改: 函数可以通过指针直接访问和修改原始结构体。
    • 语法稍复杂: 在函数内部,你需要使用箭头运算符 -> 来访问结构体成员,如 b->title
  • 适用场景: 结构体较大,并且你需要在函数中修改原始数据(也就是“编辑”)。

 


 

示例

  • 代码
    #include <iostream>
    using namespace std;struct Point {double x, y;
    };struct Circle {Point pt;double radius;
    };void printCircle(const Circle *c) {// c->pt.x += 1; // 常量不可修改cout << "(" << c->pt.x << "," << c->pt.y << ")" << c->radius << endl;
    }void moveCircle(Circle *c, int x, int y) {// cout << &c << endl;c->pt.x += x;c->pt.y += y;
    }int main() {Circle c = { {9,8},5 };// cout << &c << endl;moveCircle(&c, 1, -2);printCircle(&c);return 0;
    }
    
  • 运行
    (10,6)5
    
http://www.lryc.cn/news/617666.html

相关文章:

  • 深度学习与遥感入门(五)|GAT 构图消融 + 分块全图预测:更稳更快的高光谱图分类(PyTorch Geometric 实战)
  • rust编译过程的中间表现形式如何查看,ast,hir,mir
  • Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题
  • istio如何采集method、url指标
  • Rust:anyhow 高效错误处理库核心用法详解
  • Elasticsearch 官方 Node.js 从零到生产
  • 用 Node.js 玩转 Elasticsearch从安装到增删改查
  • 基于动态顺序表实现【通讯录系统】:有文件操作部分哦!
  • 用 Docker 安装并启动 Redis:从入门到实战
  • Spring AI赋能图像识别:大数据模型驱动下的智能化变革
  • Webpack Loader 完全指南:从原理到配置的深度解析
  • 关于JavaScript 性能优化的实战指南
  • MySQL的索引(索引的数据结构-B+树索引):
  • Godot ------ 平滑拖动01
  • vue3中的子组件向父组件通信和父组件向子组件通信
  • 对抗样本攻击检测与防御
  • STM32 ESP8266 WiFi模块驱动
  • JVM管理数据的方式
  • CV 医学影像分类、分割、目标检测,之分类项目拆解
  • 【Lua】题目小练10
  • explicit的作用是什么
  • GaussDB安全配置全景指南:构建企业级数据库防护体系
  • Mybatis学习之逆向工程(十)
  • Java项目基本流程(三)
  • SSM+Dubbo+Zookeeper框架和springcloud框架,写业务的时候主要区别在哪?
  • K8S学习----应用部署架构:传统、虚拟化与容器的演进与对比
  • Jenkins 搭建鸿蒙打包
  • 基于 ZooKeeper 的分布式锁实现原理是什么?
  • 车载软件架构 --- 车辆量产后怎么刷写Flash Bootloader
  • 品质检验·稽核管理·客诉管理一站式数字化平台——全星质量管理 QMS 软件系统