我想通过值(而不是引用)将向量传递给函数。在完成代码arr [1]之后,arr [2]和arr [3]等于0.函数getAvarage
必须具有哪些参数才能修改向量arr
。
#include <stdio.h>
#include <stdlib.h>
double getAverage(int v[]);
int main()
{
int arr[4], i;
for (i = 0 ; i < 4 ; i++){
printf("arr[%d]=", i);
scanf("%d", &arr[i]);
}
printf("avrg=%lf", getAverage(arr));
printf("\n%d %d %d", arr[1], arr[2], arr[3]);
return 0;
}
double getAverage(int v[])
{
int i;
double avg;
double sum = 0;
for (i = 0; i < 4; ++i) {
sum += v[i];
v[i] = 0;
}
avg = sum / 4;
return avg;
}
答案 0 :(得分:3)
在c中,您无法通过引用传递变量。它始终是有价值的。问题是数组被转换为指向第一个元素的指针,因此您可以通过函数内部的指针修改原始对象。
如果要确保该函数不会改变数组的内容,可以使用const
关键字。它不会严格阻止您修改对象,但它有助于检测意外修改。
double getAverage(const int *v);
您可以使用其他const
来避免重新指定指针值
double getAverage(const int *const v);
也就是说,没有充分理由将0
分配给getAverage()
函数内的值。所以它可能是
double
get_average(const int *const v)
{
int i;
double sum = 0;
for (i = 0; i < 4; ++i) {
sum += v[i];
}
return sum / 4.0;
}
答案 1 :(得分:1)
当传递给函数时,数组衰减到指向其第一个元素的指针。这是一个方便的功能。有一些类似的情况 - 函数在传递时衰减到指向函数的指针,几乎所有函数都在条件语句中衰减到bool
。这只是一个学习这些内容的案例。
有一种解决方案可以按值传递数组。结构的实例将通过值传递,因此将数组放入结构中将获得所需的结果。
struct demo
{
int some_array[4];
};
void i_cant_change_it(struct demo x)
{
x.some_array[0] = 42;
}
这是因为幸运的是,结构实例在传递给函数时不会衰减到指针。如果您希望能够改变实例,以便调用者可以看到更改,则原型看起来像
void i_might_change_it(struct demo *);