0

我正在学习 C 中的结构。当我们将结构作为参数传递给另一个函数时,我们到底在做什么?我们是否将所有成员值复制到另一个函数中?当我们传递一个数组作为参数时,我们传递的是数组的第一个地址——array[0]。结构似乎并不那么简单。我的猜测是我们既没有复制任何值也没有传递任何地址。我们告诉编译器准备好在需要时使用正在传递的结构成员的地址。我不确定..任何帮助表示赞赏。

4

4 回答 4

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(地址=0013FF74,值=1)

按值(地址=0013FF78,值=10)
my_x(地址=0013FF74,值=1)

by_ref(地址=0013FF74,值=20)
my_x(地址=0013FF74,值=20)
于 2012-05-03T14:06:51.510 回答
1

结构体既可以通过值传递,也可以通过引用传递。如果有一个大结构,建议通过引用传递,否则可能会消耗大量堆栈空间,因为传递的结构的副本将在被调用的函数中制作阅读此以了解有关结构传递的更多信息

在 C 中按值传递结构而不是传递指针有什么缺点吗?

于 2012-05-03T14:04:09.757 回答
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;
}

如果您编译并运行它,这应该回答您的问题。

于 2012-05-03T14:13:31.807 回答
0

在我们调用函数之前,编译器首先将参数压入堆栈,然后调用该函数。因此,该函数可以从堆栈中获取参数。

当通过 address 传递时,地址被传递给函数。并且编译器还会处理参数内存,称为“内存对齐”或类似的东西,以提高性能。因此,在您的函数中,您可以轻松地将该内存块转换为结构。

当按值传递时,编译器会处理参数并将处理后的参数地址传递给您的函数。

顺便说一句,在一个进程中,内存地址是相同的。任何功能都可以使用它。

于 2012-05-03T14:18:06.317 回答