【问题标题】:passing array on the heap and on the stack to function在堆和堆栈上传递数组以运行
【发布时间】:2011-06-07 13:04:23
【问题描述】:

我有一个关于将数组传递给函数 foo() 的简单 C++ 问题。假设我有两个数组 A 和 B:

double* A=new double[3];

double B[3];

当我将两者都传递给函数时

foo(double* A; double *B)

旨在操作两个数组。但是通过执行

foo(A,B)

foo 作用于 A 的副本,离开 foo() 时只保留对 B 的更改。 如果 foo 被定义为

,情况就不是这样了
foo(double* &A; double *B).

我的问题:为什么在 foo() 的第一个示例中,尽管我像 double* A 一样传递了 A 的地址(如 B 的情况),但为什么会创建一个副本?

【问题讨论】:

  • 第一行代码没有编译。此外,在这两种情况下,您传递给函数的都是指针。在这两种情况下,函数都可以通过这些指针修改数组。请改进您的问题。
  • 在 foo 的第一个声明中,两个指针都是按值传递的,所以在 foo 中,您将拥有 A 和 B 的副本。在第二个声明中,A 通过引用传递,其底层是指向指针的指针,它允许您在 foo 中更改 A。您是否知道这一点,还是我误解了您的问题?
  • 显示你的 foo() 方法代码..

标签: c++ arrays memory-management new-operator


【解决方案1】:

foo 作用于 A 的副本,离开 foo() 时只保留对 B 的更改。

你到底在 foo 里面做什么?在这两种情况下,对对象本身的更改都应该在 foo 之外可见。如果您尝试更改指针 A 的值,它将在 foo 之外不可见 - 指针的副本被传递给函数,但当然它仍然指向同一个数组。

【讨论】:

  • 我发现了我的错误。在 foo() 内部,我正在交换指针。在第一种情况下,我只交换了副本,后来我在 foo 之外操作数组时想知道我的结果。尽管如此:感谢您的帮助!
【解决方案2】:

如果要将数组引用传递给函数,则必须使用双指针引用:

foo(double** A, double **B);

double** A=new complex<double>[3];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2010-12-08
    • 2020-10-31
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多