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

如何在C中通过值将向量传递给函数,c,C,我想通过值而不是引用将向量传递给函数。执行代码arr[1]后,arr[2]和arr[3]等于0。函数getAverage应该有哪些参数不修改向量arr 在c语言中,不能通过引用传递变量。它总是以价值来衡量的。问题是数组被转换成指向其第一个元素的指针,因此您可以通过函数内的指针修改原始对象 如果要确保函数不会改变数组的内容,可以使用const关键字。它不会严格阻止您修改对象,但有助于检测意外修改 double getAverage(const int *v); 您可以使用另一个常量来避免重新分配

我想通过值而不是引用将向量传递给函数。执行代码arr[1]后,arr[2]和arr[3]等于0。函数getAverage应该有哪些参数不修改向量arr


在c语言中,不能通过引用传递变量。它总是以价值来衡量的。问题是数组被转换成指向其第一个元素的指针,因此您可以通过函数内的指针修改原始对象

如果要确保函数不会改变数组的内容,可以使用const关键字。它不会严格阻止您修改对象,但有助于检测意外修改

double getAverage(const int *v);
您可以使用另一个常量来避免重新分配指针值

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;
}

在c语言中,不能通过引用传递变量。它总是以价值来衡量的。问题是数组被转换成指向其第一个元素的指针,因此您可以通过函数内的指针修改原始对象

如果要确保函数不会改变数组的内容,可以使用const关键字。它不会严格阻止您修改对象,但有助于检测意外修改

double getAverage(const int *v);
您可以使用另一个常量来避免重新分配指针值

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;
}

数组在传递给函数时衰减为指向其第一个元素的指针。这是一个方便的功能。也有一些类似的情况-传递函数时,函数衰减为指向该函数的指针,在条件语句中,几乎所有内容都衰减为布尔值。这只是一个边走边学的例子

有一种按值传递数组的解决方案。结构的实例将按值传递,因此将数组放入结构将获得所需的结果

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

数组在传递给函数时衰减为指向其第一个元素的指针。这是一个方便的功能。也有一些类似的情况-传递函数时,函数衰减为指向该函数的指针,在条件语句中,几乎所有内容都衰减为布尔值。这只是一个边走边学的例子

有一种按值传递数组的解决方案。结构的实例将按值传递,因此将数组放入结构将获得所需的结果

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

请注意,术语是错误的。编程语言中没有向量这类东西。请注意,术语是错误的。在编程语言中没有向量这类东西。这不是一个解决方案,这是对特性的滥用。你只需要学会处理它。你什么也不说,但这是低效的,如果你不打算修改数组,就没有理由复制它,这是一种反模式。OP代码不需要修改数组,因此复制它的效率很低,因为它不是必需的。复制数组有很好的理由。别名分析就是其中之一。调用站点上可预测的行为是另一种情况——我知道函数不会改变我的副本,因为它不能。如果有帮助,编译器完全可以重写为按指针传递。阵列衰减是一种过时的性能优化或为便于使用而引入的不一致性。这不是一个优势。如果你真的需要复制数组,你应该这样做,但是从发布的代码来看,似乎没有必要。如果发布的代码是一个复制问题的最小代码样本的尝试,那就太糟糕了。因为在getAverage函数中没有逻辑理由将值设置为0。所以我认为,如果这是OP想要的答案,那就不是他们应该问的问题。这不是一个解决方案,这是对功能的滥用。你只需要学会处理它。你什么也不说,但这是低效的,如果你不打算修改数组,就没有理由复制它,这是一种反模式。OP代码不需要修改数组,因此复制它的效率很低,因为它不是必需的。复制数组有很好的理由。别名分析就是其中之一。调用站点上可预测的行为是另一种情况——我知道函数不会改变我的副本,因为它不能。如果有帮助,编译器完全可以重写为按指针传递。阵列衰减是一种过时的性能优化方法
为便于使用而引入的不一致性或不一致性。这不是一个优势。如果你真的需要复制数组,你应该这样做,但是从发布的代码来看,似乎没有必要。如果发布的代码是一个复制问题的最小代码样本的尝试,那就太糟糕了。因为在getAverage函数中没有逻辑理由将值设置为0。所以我认为,如果这是OP想要的答案,那就不是他们应该问的问题。第二个常量没有向接口添加任何信息,并且限制了实现。为什么要包括它?为了防止意外地重新分配v!第二个常量不向接口添加任何信息,并限制实现。为什么要包括它?为了防止意外地重新分配v!