为啥这个函数调用后数组会改变? [复制]

Posted

技术标签:

【中文标题】为啥这个函数调用后数组会改变? [复制]【英文标题】:Why is the array changed after this function call? [duplicate]为什么这个函数调用后数组会改变? [复制] 【发布时间】:2017-04-30 05:04:47 【问题描述】:

在下面的程序中,数组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

【问题讨论】:

为什么这个“太宽泛”了?!它基本上只是关于语法type name [] 作为函数参数... 我试图改进这个问题。唯一缺少的是:这是关于 C 还是 C++? @PravinKanna @PravinKanna 在func2(y) 中,变量是按值传递而不是引用,因为函数将在其中创建传递变量的副本,然后填充该副本变量而不是传递的变量给它。所以要让它像func1()一样工作,你需要做这样的事情void func2(int &amp;y) y=0; 引用就像内存中变量的地址。至于第一个功能请参考这篇文章***.com/questions/14312970/… 执行下面的代码,对你有帮助。 . #include&lt;iostream&gt; using namespace std; void func1 (int x[]) cout&lt;&lt;"Address of x[] in Function = "&lt;&lt; (int) x &lt;&lt; endl; x[0]=0; void func2(int y) cout&lt;&lt;"Address of y in Function = "&lt;&lt; (int) &amp;y &lt;&lt; endl; y=0; int main() int x[]=7, y=8; cout&lt;&lt;"Address of y in Main = "&lt;&lt; (int) &amp;y &lt;&lt; endl; func2(y); cout&lt;&lt;"Address of x[] in Main = "&lt;&lt; (int) x &lt;&lt; endl; func1(x); //std::cout &lt;&lt; x[0] &lt;&lt; y; return 0; 【参考方案1】:

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

【讨论】:

【参考方案2】:

为了您的信息,我将值放在每一行前面的注释中

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;
 

【讨论】:

【参考方案3】:

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

x[0]=7

函数调用后

x[0]=0   

这就是你的数组值被改变的原因。 而对于变量,你没有返回任何东西,这就是为什么没有改变它。 所以08 是这种情况下的正确输出

【讨论】:

以上是关于为啥这个函数调用后数组会改变? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在调用它的析构函数后我可以访问这个堆栈分配的对象? [复制]

为啥这个 stl 函数调用会导致不正确的布尔评估? [复制]

调用函数时为啥形参的值不能传给实参

为啥调用函数后字符串值保持不变[重复]

为啥在按值返回时总是调用复制构造函数

为啥调用函数时指针会改变地址?