我应该通过引用将int数组传递给函数吗?

问题描述

下面是我正在谈论的基本概念。

#include <stdio.h>

void someFunction(int arr[],int n)
{
    for (int i = 0; i < n; ++i)
        arr[i] *= 2;
}


void someFunctionByReference(int *arr,int n)
{
    for (int i = 0; i < n; ++i)
        arr[i] *= 2;
}


int main()
{
    int arr[] = {5,3,2,4,5,7,0};
    int n = sizeof(arr) / sizeof(arr[0]);
    someFunction(arr,n);
    
    int arr2[] = {5,0};
    int n2 = sizeof(arr2) / sizeof(arr2[0]);
    someFunctionByReference(arr2,n2);
    return 0;

}

这两个函数(如我所见)都执行相同的操作。它们甚至包含相同的代码。但是,我想了解两者之间的区别,以及在某些情况下是否存在适当且不合适的方法

解决方法

函数调用和定义都是相同的。在大多数情况下,数组类型的表达式将“衰减”为指针类型的表达式,并且表达式的值将成为第一个元素的地址。在函数参数声明的上下文中,T a[N]T a[]被解释为T *a-参数是一个指针,而不是数组对象。这是因为当您将数组表达式作为函数参数传递时,该函数实际上将接收指针值,而不是数组。

此行为是数组表达式所独有的-其他聚合类型,例如structunion类型不会以这种方式“衰减”。如果您传递带有数组成员的结构类型,则该数组成员的内容将被复制。

这也不是“通过引用传递”的示例。 C按值传递所有函数参数,没有例外。有时,这些值是指针。这个特殊的奇怪之处只是C如何对待数组的结果。