可以通过将数组包装在struct 中来做到这一点。您可以包含一个用于数组大小的字段,这样您就不需要显式传递此参数。这种方法的优点是避免了以后必须释放的额外内存分配。
C 已经通过值将参数传递给函数,但数组标识符在大多数表达式中衰减为指针,尤其是在函数调用中。然而structs 不会衰减为指针,而是按值传递给函数,这意味着原始结构及其所有内容的副本在函数范围内是可见的。如果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