为什么在此函数调用后数组发生了变化?

时间:2017-04-30 05:04:47

标签: c++ c arrays function

在下面的程序中,将数组作为参数传递给修改其参数的某个函数后,数组x的第一个元素的值打印为零。 int变量y不会发生同样的情况,另一个函数的修改在调用函数中未被注意到。因此,我希望数组在函数调用之前保留其值,就像y一样。为什么在变量不是时更改了数组?

void func1 (int x[]){
    x[0]=0;
}
void func2(int y){
    y=0;
}

int main(){
    int x[]={7}, y=8;
    func1(x);
    func2(y);
    cout << x[0] << y;
    return 0;
}

输出:

08

预期:

78

3 个答案:

答案 0 :(得分:0)

参数int[]int*完全相同,是{int}的指针。传递给函数的数组衰减到指向数组的第一个元素的指针,因此通过下标运算符取消引用它,并修改int pointee导致原始数据被修改。

答案 1 :(得分:0)

对于您的信息,我将值放在每行的评论中

void func1 (int x[]){
x[0]=0;//x here has same address as in main function so changes can be //directly apply to the original value of x array
//x[0]=7 was passed in this function is now modified by have a value x[0]=0

    } 
void func2(int y){
y=0;//but y is a different variable in this function it is not the same y in main function so if you change its value it does not mean that you are changing the value of y in main function so it does not give you the expected output
// it is due to local variable concept y in func2 is different and y in main is a different so all you have to do is to pass address of y variable so that if you want to change any thing is y will directly change its value in main function
}

int main(){
int x[]={7}, y=8;
func1(x);
func2(y);
cout << x[0] << y;
return 0;
 }

答案 2 :(得分:0)

数组使用连续的内存位置来存储数据。 当您调用func1(int x[])时,之前的值会随着函数给出的值而改变,并且位置保持不变,所以
在主要功能

x[0]=7

函数调用后

x[0]=0   

这就是你的数组值发生变化的原因 对于变量,你没有返回任何为什么没有变化的变量。 所以08是这种情况的正确输出