函数中的数组初始化

Array initialization in function

本文关键字:初始化 数组 函数      更新时间:2023-10-16

我有以下问题:假设我有一些类型为int的函数f。因此,当我f(a)调用此函数时,发生的第一件事是函数中的新变量被声明int x=a;这就是为什么如果有一个函数void f(int a){a++}为某个变量调用该函数不会改变其值。

现在让我们假设有一个类型int array[5]的函数。调用此函数时会发生什么情况?我问的原因是因为我读到如果函数尝试使用a初始化其他数组,它将不起作用。

我想知道的另一件事如下。数组int a[5]int b[6]会被视为具有不同的数据类型吗?

void f(int a[5])具有误导性,因为它实际上是void f(int a[])void f(int *a)

要传递大小,您必须通过指针或引用传递数组:void f(int (&a)[5])

因此,void f(int a[5])void f(int b[6])是相同的功能声明。

实际上没有将数组传递给函数(按值)的语义类似物,因为您将传递整数。这是因为数组类型不允许作为函数参数。

有一个句法类比:你确实可以写void(int[5])但意思不同。此语法实际上与void(int*)含义相同。换句话说,参数是一个指针。


我想知道的另一件事如下。数组 int a[5] 和 int b[6] 会被视为具有不同的数据类型吗?

int[5]int[6]是不同的类型,是的。但是,在函数参数的声明中,语法int[5]的含义不是类型int[5]而是int*。同样,语法int[6]也具有类型int*的含义。因此,在函数参数的声明中,并且仅在该上下文中,int[5]int[6]确实意味着相同的类型:int*


数组类型(int[C])的表达式在作为参数传递时会自动转换为指向第一个元素(类型为int*)的指针。这种转换称为数组衰减。因此,以下格式良好:

void foo(int[5]); // type of argument is int*
void bar() {
int arr[6];  // type of arr is not int*
foo(arr);    // arr decays to int*
}

不复制阵列。执行数组到指针的转换,并将该指针复制为参数。因此,可以修改指针指向的对象。

该值将被更改,因为将发送数组的引用,而不是创建新的基元类型变量,如 int x=0 和 func(x);

发送数组时,值(如果在函数中更改)也将全局更改,因为它会更改引用指针的值。