我有以下问题:假设我有一些f
类型的函数int
。所以当我调用这个函数f(a)
时,发生的第一件事就是声明函数中的一个新变量int x=a;
这就是为什么如果一个函数void f(int a){a++}
调用该函数的某个函数变量不会改变它的价值。
现在假设有一个int array[5]
类型的函数。当我调用这个函数时会发生什么?我问的原因是因为我读到如果函数尝试使用a
初始化其他数组,它将无法工作。
我想知道的另一件事是以下内容。数组int a[5]
和int b[6]
会被视为具有不同的数据类型吗?
答案 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);
发送数组时,值(如果在函数内更改)也将全局更改,因为它会更改引用指针的值。