给函数传入结构体和传入该结构体的指针在 C/C++ 中有以下几个关键区别:
1. 传递方式
-
传入结构体(按值传递):
- 当把结构体按值传递给函数时,函数会创建一个结构体的副本。这意味着函数中对结构体的任何修改都不会影响原始结构体的数据,因为修改的只是副本。
- 副本是结构体的一个独立拷贝,与原始结构体无关。
-
传入结构体指针(按引用传递):
- 当把结构体的指针传递给函数时,函数接收到的是原始结构体的地址。这样,函数内部对结构体成员的修改会直接影响原始结构体的数据。
- 指针传递的是地址而不是数据本身,因此不会产生结构体的副本。
2. 内存消耗和性能
-
按值传递:
- 如果结构体很大,按值传递会导致大量内存消耗,因为每次调用函数时都需要复制整个结构体。
- 在这种情况下,性能可能会受到影响,尤其是当结构体包含许多成员时。
-
按引用传递(传指针):
- 传递结构体的指针只需要传递一个地址(通常是 4 或 8 个字节,取决于系统架构),这比传递整个结构体要高效得多。
- 当结构体很大时,使用指针可以显著减少内存开销和函数调用的性能开销。
代码举例:
#include <stdio.h>
typedef struct {
int a;
int b;
} MyStruct;
// 按值传递
void passByValue(MyStruct s) {
s.a = 10; // 只修改副本,不影响原始结构体
}
// 按指针传递
void passByPointer(MyStruct* s) {
s->a = 10; // 直接修改原始结构体的值
}
int main() {
MyStruct myStruct = {1, 2};
passByValue(myStruct);
printf("After passByValue, a = %d\n", myStruct.a); // 输出仍然是 1
passByPointer(&myStruct);
printf("After passByPointer, a = %d\n", myStruct.a); // 输出是 10
return 0;
}
标签:按值,传入,函数,myStruct,传递,指针,结构
From: https://blog.csdn.net/weixin_57904199/article/details/143265854