C++的结构体传参
前置知识
点运算符
- 符号:
.
- 用途:用于直接访问结构体或类对象的成员
- 语法:
对象名.成员名
- 解析过程:编译器在编译时就确切地知道对象在内存中的位置,以及每个成员相对于对象起始地址的偏移量。因此,
对象名.成员名
是一种直接访问,编译器能够迅速找到并操作该成员。
箭头运算符
- 符号:
->
- 用途:用于通过指向结构体或类的指针来访问其成员。
- 语法:
指针名->成员名
- 解析过程:
->
运算符是(*指针名).成员名
的语法糖(syntactic sugar)。它的操作分两步:- 解引用:首先,它对指针进行解引用
(*指针名)
,以获取指针所指向的实际对象。 - 成员访问:然后,它使用点运算符
.
,来访问该对象的成员。
- 解引用:首先,它对指针进行解引用
点运算符和箭头运算符的总结
运算符 | 用于 | 语法 | 行为 |
---|---|---|---|
. | 对象(实体) | 对象名.成员名 | 直接访问成员 |
-> | 指针 | 指针名->成员名 | 解引用指针后访问成员 |
关键在于:是一个对象还是一个指向该对象的地址?
指针传递(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