函数中的数组初始化

时间:2018-01-16 13:10:30

标签: c++

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

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

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

3 个答案:

答案 0 :(得分:5)

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])是相同的函数声明。

答案 1 :(得分:1)

实际上没有语义模拟将数组传递给函数(按值),就像传递整数一样。这是因为不允许数组类型作为函数参数。

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

  

我想知道的另一件事是以下内容。数组int [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*
}

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

答案 2 :(得分:-1)

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

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