当我将结构作为参数传递给另一个函数时,我正在学习C.中的结构,我们究竟在做什么?我们在另一个函数中复制所有成员值吗?当我们传递数组作为参数时,我们传递数组的第一个地址 - array [0]。事情看起来并不那么简单。我的猜测是我们既不复制任何价值也不传递任何地址。我们告诉编译器准备好在需要时使用传递的结构成员的地址。我不确定..任何帮助表示赞赏。
答案 0 :(得分:1)
结构可以通过值和引用传递。如果有一个大的结构,建议通过引用传递,否则可能会消耗大量的堆栈空间,因为传递的结构的副本将在被调用的函数中进行 阅读本文以了解有关结构传递的更多信息
Are there any downsides to passing structs by value in C, rather than passing a pointer?
答案 1 :(得分:1)
这取决于struct
的传递方式:
struct
所做的更改对调用者不可见struct
所做的更改对调用者可见例如:
#include <stdio.h>
struct X {
int value;
};
void pass_by_value(struct X a_x)
{
a_x.value = 10;
printf("by_value(address=%p, value=%d)\n", &a_x, a_x.value);
}
void pass_by_ref(struct X* a_x)
{
a_x->value = 20;
printf("by_ref(address=%p, value=%d)\n", a_x, a_x->value);
}
int main()
{
struct X my_x = { 1 };
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
pass_by_value(my_x);
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
pass_by_ref(&my_x);
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
return 0;
}
输出:
my_x(address=0013FF74, value=1) by_value(address=0013FF78, value=10) my_x(address=0013FF74, value=1) by_ref(address=0013FF74, value=20) my_x(address=0013FF74, value=20)
答案 2 :(得分:1)
#include <stdio.h>
struct foo {
int a;
}
void by_value(struct foo x) {
x.a = 10;
}
void by_reference(struct foo* x) {
x->a = 10;
}
int main(int argc, char* argv[]) {
struct foo v;
v.a = 5;
by_value(v);
printf("%d\n", v.a);
by_reference(&v);
printf("%d\n", v.a);
return 0;
}
如果您编译并运行它,这应该回答您的问题。
答案 3 :(得分:0)
在调用函数之前,编译器首先将参数压入堆栈,然后调用函数。 因此,该函数可以从堆栈中获取参数。
当通过地址传递时,地址将传递给该函数。 并且编译器还将处理参数存储器,称为“存储器对齐”或类似的东西,以提高性能。 因此,在您的函数中,您可以轻松地将该内存块转换为结构。
当按值传递时,编译器会处理参数并将coped参数地址传递给您的函数。
顺便说一句,在一个过程中,内存地址是相同的。 任何功能都可以使用它。