我们可以在 C/C++ 函数头中将数组作为变量传递,如
int func(int arr[]) { ... }
我想知道:是否有可能[]
在传递给函数头的变量中存在某些内容,或者它总是空的?
对于任何(非引用)类型T
,函数签名 R foo(T t[])
和R foo(T t[123])
(或任何其他数字)都与 相同R foo(T * t)
,并且通过传递第一个元素的地址来传递数组。
请注意,T
它本身可能是数组类型,例如T = U[10]
.
对于一维数组,它总是空的,括号是另一种写法:
int fun(int * arr)
{
}
至于二维数组,需要指定每个元素本身包含多少个元素
int fun(int arr[][3])
{
}
int func(int arr[]) { ... } 是传递给函数的数组的无效声明。
数组名是一个指针变量。所以我们只需传递数组名称(它本身就是一个指针)就足够了
int func(int *arr) { ... } 将数组的起始地址传递给函数,以便它可以使用数组。
如果原始数组需要保持完整,可以在函数中创建和使用数组的副本。
在大多数情况下,数组的名称会衰减为指向其第一个元素的指针。所以当你写
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;
.