gpt4 book ai didi

c - 按值传递数组

转载 作者:太空狗 更新时间:2023-10-29 16:43:39 26 4
gpt4 key购买 nike

一般我们按名称传递数组时,就是按地址调用。这意味着如果我们在 main() 之外更改数组的任何值,它将反射(reflect)在 main() 中。

那么,如果我想将数组作为函数的参数传递并在 main() 中调用它,那么该函数中的任何更改都不会反射(reflect)在内部,我应该怎么做main()?

例如:

void Foo(int arr[])   //takes an integer array `arr` as argument
{
// do something with `arr
}

int main()
{
int abc[]={5,1,2,9};
//do something to pass `abc` inside `Foo` so that changes inside `Foo` doesn't change the value of `abc` array.
}

现在我想将 abc 数组按值传递给 Foo

最佳答案

可以通过将数组包装在 struct 中来实现。您可以包含一个数组大小字段,这样您就不需要显式传递此参数。这种方法的优点是避免了以后必须释放的额外内存分配。

C 已经按值将参数传递给函数,但数组标识符在大多数表达式中衰减为指针,尤其是在函数调用中。然而 struct 不会衰减为指针,而是按值传递给函数,这意味着原始结构的副本及其所有内容在函数范围内可见。如果 struct 包含一个数组,它也会被复制。请注意,如果 struct 包含一个指向动态数组的 int 的指针,则在传递 struct 时复制该指针到函数,但副本和原始指针都引用了相同的内存。此方法依赖于包含实际数组的 struct

另请注意,struct 不能包含类型不完整的成员,因此也不能包含 VLA。在这里,我将全局常量 MAX_ARR 定义为 100,以便为处理具有相同 struct 类型的不同大小的数组提供一些空间。

您还可以从函数返回一个struct。我已经包含了一个示例,它修改了传递给函数的 Array struct,并返回修改后的 struct 以分配给不同的 Array struct 在调用函数中。这导致调用者可以访问原始数组和转换后的数组。

#include <stdio.h>

#define MAX_ARR 100

struct Array {
size_t size;
int array[MAX_ARR];
};

void print_array(struct Array local_arr);
void func(struct Array local_arr);
struct Array triple(struct Array local_arr);

int main(void)
{
struct Array data = {
.size = 10,
.array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
};
struct Array transformed_data;

func(data);
transformed_data = triple(data);

printf("Original\n");
print_array(data);

printf("Transformed\n");
print_array(transformed_data);

return 0;
}

void print_array(struct Array local_arr)
{
for (size_t i = 0; i < local_arr.size; i++) {
printf("%5d", local_arr.array[i]);
}
putchar('\n');
}

void func(struct Array local_arr)
{
for (size_t i = 0; i < local_arr.size; i++) {
local_arr.array[i] *= 2;
}
printf("Modified\n");
print_array(local_arr);
}

struct Array triple(struct Array local_arr)
{
for (size_t i = 0; i < local_arr.size; i++) {
local_arr.array[i] *= 3;
}
return local_arr;
}

程序输出:

Modified
2 4 6 8 10 12 14 16 18 20
Original
1 2 3 4 5 6 7 8 9 10
Transformed
3 6 9 12 15 18 21 24 27 30

关于c - 按值传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com