5

我们可以在 C/C++ 函数头中将数组作为变量传递,如

int func(int arr[]) { ... }

我想知道:是否有可能[]在传递给函数头的变量中存在某些内容,或者它总是空的?

4

4 回答 4

10

对于任何(非引用)类型T,函数签名 R foo(T t[])R foo(T t[123])(或任何其他数字)都与 相同R foo(T * t),并且通过传递第一个元素的地址来传递数组。

请注意,T它本身可能是数组类型,例如T = U[10].

于 2012-10-29T23:39:57.693 回答
3

对于一维数组,它总是空的,括号是另一种写法:

int fun(int * arr)
{

}

至于二维数组,需要指定每个元素本身包含多少个元素

int fun(int arr[][3])
{

}
于 2012-10-29T23:35:24.583 回答
3

int func(int arr[]) { ... } 是传递给函数的数组的无效声明。

数组名是一个指针变量。所以我们只需传递数组名称(它本身就是一个指针)就足够了

int func(int *arr) { ... } 将数组的起始地址传递给函数,以便它可以使用数组。

如果原始数组需要保持完整,可以在函数中创建和使用数组的副本。

于 2012-10-30T10:58:47.200 回答
0

在大多数情况下,数组的名称会衰减为指向其第一个元素的指针。所以当你写

void f(int arr[]);
void g(int arr[42]);

该名称arr衰减为指向 int 的指针。这两个声明等价于:

void f(int *arr);
void g(int *arr);

名称不会衰减的两个地方是在数组的定义中和作为sizeof. 所以这个全局范围的声明没有定义一个指向 int 的指针:

int arr[];

我之所以提到这个特殊的错误,是因为它很容易犯,而且很难追查。这定义了一个数组,而不是一个指针,即使没有指定元素的数量。arr从另一个源文件引用为int *arr;.

于 2012-10-30T12:55:13.053 回答