【问题标题】:What is the diffrence between pass by reference and dynamic memory allocation [closed]引用传递和动态内存分配之间有什么区别[关闭]
【发布时间】:2018-11-21 09:36:25
【问题描述】:

我只是想知道以上两者的区别。是否有所谓的动态内存分配,因为指针传递引用特性?

【问题讨论】:

  • 您的问题没有意义,因为这两件事彼此无关。它们是完全正交的。
  • 您能否澄清您的问题,因为这些操作根本不相似。一种是分配内存,一种是在其他地方传递信息。这就像买书和告诉朋友书架上有书的区别。
  • @SamiKuhmonen 我只是想知道它们是相似的还是相互依赖或不同或不相互依赖?

标签: c++ pass-by-reference dynamic-memory-allocation


【解决方案1】:

这两个是两个不同的东西。

在 C++ 中,按引用传递是通过将& 添加到函数中的参数来完成的:

void func(&a) {
   a = 5;
}

int main() {
    int a = 0;
    printf("%d", a);
    func(a);
    printf("%d", a);
    return 0;
}

上面的代码会将变量a的引用传递给func()。这会导致main() 方法中变量a 的值也发生变化。

动态内存分配是另一回事。如下:

int* arr;
arr = new int[n];

n 将在运行时确定。如上动态分配的内存应自行释放,避免内存泄漏。

【讨论】:

    【解决方案2】:

    您真正感兴趣的对比是通过引用传递和通过指针传递。

    void f(int* ip) {
        ++*ip;
    }
    
    void g(int& ir) {
        ++ir;
    }
    
    int main() {
        int i = 0;
        f(&i);
        std::cout << i << '\n'; // i is 1
        g(i);
        std::cout << i << '\n'; // i is 2
        return 0;
    }
    

    在过去(当我们都用 C 编写代码时)没有引用,所以如果您希望能够创建一个对象,将其传递给一个函数,并让该函数修改该对象,您可以传递该对象的地址。在函数内部,您可以取消引用指针,这样您就可以修改传入的对象。这就是函数 f 所做的。

    在 C++ 中,我们通过引用传递。这使您可以使用对象本身调用函数,而无需获取地址;并且在函数中,不需要取消引用指针。这就是函数g 的作用。

    这两种方法都适用于您在堆栈上创建的对象以及您使用动态分配(即使用new)创建的对象。以前的版本使用堆栈上的一个对象。这是一个使用new 创建的对象:

    int main() {
        int *ii = new int(0);
        f(ii);
        std::cout << *ii << '\n'; // ii is 1
        g(*ii);
        std::cout << *ii << '\n'; // ii is 2
        delete ii;
        return 0;
    }
    

    【讨论】:

    • 别忘了还有按值传递,这实际上不仅仅只是语法糖。
    • @GoswinvonBrederlow -- 我没有忘记;问题是关于引用和指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2012-01-13
    • 2010-09-18
    • 2014-10-02
    • 2022-01-07
    相关资源
    最近更新 更多