我们什么时候需要将数组的大小作为参数传递

sky*_*oor 7 c c++ arrays parameters

关于在C/C++中传递数组我有点困惑.我看到一些签名就像这样的情况

void f(int arr[])
Run Code Online (Sandbox Code Playgroud)

有些是这样的

void f(int arr[], int size)
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细说明有什么区别以及何时以及如何使用它?

Alo*_*hal 9

首先,传递给函数的数组实际上将指针传递给数组的第一个元素,例如,如果你有的话

int a[] = { 1, 2, 3 };
f(a);
Run Code Online (Sandbox Code Playgroud)

然后,f()&a[0]传递给它.因此,在编写函数原型时,以下内容是等效的:

void f(int arr[]);
void f(int *arr);
Run Code Online (Sandbox Code Playgroud)

这意味着数组的大小会丢失,并且f()通常无法确定大小.(这就是我更喜欢void f(int *arr)表格的原因void f(int arr[]).)

有两种情况f()不需要信息,在这两种情况下,可以没有额外的参数.

首先,有一些特殊的,同意的价值,arr即呼叫者和f()意思是"结束".例如,人们可以同意一个值0意味着"完成".

然后人们可以写:

int a[] = { 1, 2, 3, 0 }; /* make sure there is a 0 at the end */
int result = f(a);
Run Code Online (Sandbox Code Playgroud)

并定义f()类似的东西:

int f(int *a)
{
    size_t i;
    int result = 0;
    for (i=0; a[i]; ++i)  /* loop until we see a 0 */
        result += a[i];
    return result;
}
Run Code Online (Sandbox Code Playgroud)

显然,上述方案仅适用,如果双方在主叫用户和被叫同意的公约,并按照它.一个例子是strlen()C库中的函数.它通过查找a来计算字符串的长度0.如果你传递了一些没有0结尾的东西,所有的赌注都会被取消,你处于未定义的行为区域.

第二种情况是你没有真正的阵列.在这种情况下,f()获取指向对象的指针(int在您的示例中).所以:

int change_me = 10;
f(&change_me);
printf("%d\n", change_me);
Run Code Online (Sandbox Code Playgroud)

void f(int *a)
{
    *a = 42;
}
Run Code Online (Sandbox Code Playgroud)

很好:f()无论如何都不在阵列上运行.