在C语言中,数组名表示地址,当我们传递一个数组时,我们实际上传递的是地址,而参数接收函数总是将它们作为指针接受。
如何按值传递数组,即,当我们将数组传递给函数时,如何确保我们有一个新的数组副本?
这可以通过将数组包装在结构中并创建该结构类型的变量并将值分配给该数组来完成。之后,将变量传递给其他函数并根据要求对其进行修改。请注意,数组成员在作为参数传递时会被复制,但动态数组不是。因此,此解决方案仅适用于非动态数组(在没有 new 或 malloc 的情况下创建)。
让我们看一个使用 C 程序演示上述事实的示例:
输出:
// C program to demonstrate passing an array
// by value using structures.
#include<stdio.h>
#include<stdlib.h>
# define SIZE 5
// A wrapper for array to make sure that array
// is passed by value.
struct ArrayWrapper
{
int arr[SIZE];
};
// An array is passed by value wrapped in temp
void modify(struct ArrayWrapper temp)
{
int *ptr = temp.arr;
int i;
// Display array contents
printf("In 'modify()', before modificationn");
for (i = 0; i < SIZE; ++i)
printf("%d ", ptr[i]);
printf("n");
// Modify the array
for (i = 0; i < SIZE; ++i)
ptr[i] = 100; // OR *(ptr + i)
printf("nIn 'modify()', after modificationn");
for (i = 0; i < SIZE; ++i)
printf("%d ", ptr[i]); // OR *(ptr + i)
}
// Driver code
int main()
{
int i;
struct ArrayWrapper obj;
for (i=0; i<SIZE; i++)
obj.arr[i] = 10;
modify(obj);
// Display array contents
printf("nnIn 'Main', after calling modify() n");
for (i = 0; i < SIZE; ++i)
printf("%d ", obj.arr[i]); // Not changed
printf("n");
return 0;
}
In 'modify()', before modification 10 10 10 10 10 In 'modify()', after modification 100 100 100 100 100 In 'Main', after calling modify() 10 10 10 10 10