只更改不需要的结构成员。但是要将实际指针 更改为 结构,您需要通过使用指向结构的指针的指针来模拟 按引用传递。
例如,只更改一个成员就足够了
void initializeFields(struct someStruct* foo)
{
foo->field1 = 1;
foo->field2 = 2;
}
int main(void)
{
struct someStruct bar;
initializeFields(&bar);
printf("field1 = %d\n", bar.field1);
printf("field2 = %d\n", bar.field2);
return 0;
}
但是,例如,如果您想在函数中动态分配结构,则需要模拟按引用传递:
void initializeFields(struct someStruct** foo)
{
// The difference is this assignment
*foo = malloc(sizeof(struct someStruct));
(*foo)->field1 = 1;
(*foo)->field2 = 2;
}
int main(void)
{
struct someStruct* bar;
initializeFields(&bar);
printf("field1 = %d\n", bar->field1);
printf("field2 = %d\n", bar->field2);
return 0;
}
另外两个例子来说明按值传递和模拟按引用传递之间的区别。
考虑以下程序:
#include <stdio.h>
void foo(int y)
{
y = 5;
}
int main(void)
{
int x = 1;
printf("1: x = %d\n", x);
foo(x);
printf("2: x = %d\n", x);
return 0;
}
上面的程序会打印出来
1:x = 1
2:x = 1
这是因为x 中的值的副本 被传递给函数foo。修改foo内部的本地副本不会修改main内部的原始变量x。
现在模拟通过引用传递:
#include <stdio.h>
void foo(int *y)
{
*y = 5;
}
int main(void)
{
int x = 1;
printf("1: x = %d\n", x);
foo(&x);
printf("2: x = %d\n", x);
return 0;
}
这个程序将打印
1:x = 1
2:x = 5
这是因为我们没有改变函数foo中的指针变量y,而是改变了它指向的位置的值,这恰好是main函数中的变量x。