函数标头中的C/C 数组变量

C/C++ array variable in function header

本文关键字:变量 数组 函数      更新时间:2023-10-16

我们可以将数组作为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){...}会将数组的起始地址传递到该函数,以便它可以使用数组。

如果需要完整地保持原始数组,则可以创建数组的副本&在功能中使用。

数组的名称在大多数上下文中腐烂到 Pointer 到其第一个元素。所以当你写

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

名称 arr腐烂到int指针。这两个声明等同于这些声明:

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

名称不衰减的两个位置在数组的定义中,作为sizeof的论点。因此,全局范围的此声明并不能定义指向INT的指针:

int arr[];

我提到这个特殊的,因为这是一个容易犯的错误,而且很难追踪。即使未指定元素的数量,这也定义了一个数组,而不是指针。这是一个错误(但不必诊断出一个错误)从另一个源文件中引用arrint *arr;