【问题标题】:Call by value VS call by reference C++ address understanding按值调用VS按引用调用C++地址理解
【发布时间】:2021-04-25 21:18:50
【问题描述】:

所以我目前正在学习一门名为数据结构和算法的课程,在第一堂课中,我遇到了一个我无法完全回答的问题。老师试图通过以下方式展示使用调用的价值值和引用调用。他正在将一个数据结构传递给一个打印数据结构地址的函数。

代码基本上是这样的:

struct Exempelstruct{
    int m_intValue1;
    int m_intValue2;
    float m_array[1000];
};

void skrivAdresser1(Exempelstruct theStruct){
    writeAdresses( theStruct );
}
//and
void skrivAdresser2(const Exempelstruct &theStruct){
    writeAdresses( theStruct );
}

问题是为什么skrivAdresser1() 函数中的地址低于skrivAdresser2() 打印的地址?

【问题讨论】:

  • 您还必须显示main,它显示了调用这两个函数的顺序,但您可能有兴趣了解stack frame 的工作原理,这将解释为什么一个地址较低比另一个。
  • “他正在将一个数据结构传递给一个打印数据结构地址的函数”这里应该更精确:一个数据结构的实例(!)在这里传递(通过值和通过引用)。
  • 函数的调用顺序如下: Exempelstruct s; skrivAdresser1(s); skrivAdresser2(s);抱歉忘记包括在内。
  • 也许只是为了清楚起见:请同时提供 writeAdresses() 函数!
  • 也许这是在回答你的问题:stackoverflow.com/questions/4560720/…

标签: c++ call-by-value


【解决方案1】:

基本上,你需要研究按值调用和按引用调用的工作原理。

在按值调用中,函数复制参数的实际值 进入函数的形参。所以地址 形参明显与实际参量不同 值(可能大于或小于哪个地址为空)。

在引用调用中,实际值是通过&传递的,所以有 与原始值相同。

【讨论】:

    【解决方案2】:

    skrivAddresser1 中的结构是稍后构建的,而 skrivAddresser2 中的结构与之前创建的 main 中的结构相同。导致 main 较早调用。堆栈变量的规则是稍后创建较低的地址。因此,您之前在 main 中调用哪个并不重要,因为 skrivAddress2 不会创建新对象。并且总是在调用 skrivAddress 函数之前创建原始对象。

    【讨论】:

    • 感谢您的回答!这就是我一直在寻找的答案,我不明白为什么首先完成的事情得到了更高的地址,但我明白了,谢谢!
    • “栈变量的规则是以后创建低地址”:请记住,这是平台相关的!
    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多