如何通过C中的值将向量传递给函数

时间:2016-11-05 11:36:05

标签: c

我想通过值(而不是引用)将向量传递给函数。在完成代码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;
}

2 个答案:

答案 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 *);