c++ - 将 &variable 传递给函数
问题描述
我对此代码的第 2 行和第 9 行有疑问。
我已经在代码块上运行了这段代码,结果发现它在第 9 行的末尾trip(&y)
运行并y=21
生成。这不是我所期望的。
我以为&y
会返回地址(如十六进制数)并将其传递给trip
. 然后trip
将地址的奇怪(十六进制)数字增加三倍,并可能更改 的地址int y
,或产生错误。
我的逻辑的哪一部分有问题?
我的逻辑是:
&y
返回变量的地址(十六进制)。trip (int* x)
接受数字(在这种情况下为地址)并将其增加三倍。- 因此,没有对 的实际值进行任何处理
y
,即7
。
编辑:答案是 105。
解决方案
您y
对函数的地址是正确的trip(int*)
。
您的错误是该函数trip(int*)
取消引用地址以访问它指向的值。
假设y
值为 7 并存储在地址 0x0014(为方便起见而简化)。该函数trip(int*)
获取地址 0x0014 并使用它来获取 7 的值y
。现在它将这个值增加三倍并将结果存储在地址指向的位置。y
因此用新值 21覆盖值 7 。
这种地址的取消引用是由x
函数体中 前面的星号 (*) 完成的trip(int*)
。
澄清。地址不一定是十六进制值。十六进制只是显示数字的一种方式。地址只是内存中某个位置的数字。在这种情况下,0x0014 与十进制的 20 相同。含义y
存储在地址 20(十进制)。
请记住,指针很少是做某事的正确方法。就像在这种情况下使用函数一样quin(int&)
。用指针解决的问题,在trip(int*)
中解决得更干净quin(int&)
。参考文献更干净、更安全。
该函数trip(int*)
不检查给定地址无效的情况(给定地址是NULL
/ nullptr
)。quin(int&)
甚至不必检查这一点,因为引用不能NULL
在 C++ 中。
如果必须使用指针,请考虑使用 和 之类的智能std::unique_ptr<T>
指针std::shared_ptr<T>
。
推荐阅读
- html - 如何将此引导程序 4 移动到屏幕的垂直中心?
- html - 如何在与导航链接相同的空间中获取导航栏徽标和名称?
- r - 如何根据另一列中的模式从两列中的任意一列中选择值
- python-2.7 - 重载 __divmod__ 方法未按预期工作
- jquery - 用jquery填充动态图像字段
- javascript - 带有更新面板的内容页面未运行 javascript?
- c# - 如何删除richEditControl 中的边距(缩进)?
- android - 为什么 imageview 中的 wrap_content 不会根据实际宽度使其变大?
- math - 在 Lua 5.3 中,不推荐使用双曲线函数,所以我应该直接使用它们还是重写它们?
- kivy - 来自十六进制的 Kivy 标签背景颜色