【问题标题】:Passing &variable to an function将变量传递给函数
【发布时间】:2019-10-08 05:42:53
【问题描述】:

我对此代码的第 2 行和第 9 行有疑问。
我已经在代码块上运行了这段代码,结果发现 trip(&y) 运行并在第 9 行末尾生成 y=21。这不是我所期望的。

我认为&y 会返回地址(如十六进制数字)并将其传递给trip。然后trip 将使地址的奇怪(十六进制)数字增加三倍,并可能更改int y 的地址,或者产生错误。

我的逻辑的哪一部分有问题?

我的逻辑是:

  1. &y 返回变量的地址(十六进制)。
  2. trip (int* x) 接收数字(在这种情况下为地址)并将其增加三倍。
  3. 因此,没有对y 的实际值(7)进行任何处理。

编辑:答案是 105。

【问题讨论】:

  • 答案是 105
  • 副本在 C 上,但此处提出的问题(与指针相关)已在此处得到解答。
  • 请edit 将附加信息添加到问题中,而不是将其隐藏在评论中。
  • &y是y的地址是的,交给函数。但是,您错过了内部函数*x,而不是纯x。阅读 * 运营商。

标签: c++


【解决方案1】:

你对y的地址是正确的,它被赋予了函数trip(int*)。

您的错误是函数trip(int*) 取消引用地址以访问它指向的值。

假设 y 的值为 7 并存储在地址 0x0014(为方便起见而简化)。 函数trip(int*) 获取地址0x0014 并使用它来获取y 的值7。 现在它将这个值增加三倍并将结果存储在地址指向的位置。从而将y的值7覆盖为新值21。

此地址的取消引用由函数 trip(int*) 中 x 前面的星号 (*) 完成。

澄清一下。地址不一定是十六进制值。十六进制只是显示数字的一种方式。地址只是内存中某个位置的数字。在这种情况下,0x0014 与十进制的 20 相同。含义 y 存储在地址 20(十进制)。

请记住,指针很少是做某事的正确方法。就像在这种情况下使用函数quin(int&)。用trip(int*) 中的指针解决的问题,在quin(int&) 中解决得更干净。引用更清晰、更安全。

函数trip(int*)不检查给定地址无效的情况(给定地址为NULL/nullptr)。 quin(int&) 甚至不必检查这一点,因为在 C++ 中引用不能是 NULL。

如果您必须使用指针,请考虑使用智能指针,例如 std::unique_ptr<T> 和 std::shared_ptr<T>。

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 2012-03-02
    • 2011-01-18
    • 2015-05-02
    • 2015-12-17
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多