C++指针和&Pointer之间的区别[重复]
Posted
技术标签:
【中文标题】C++指针和&Pointer之间的区别[重复]【英文标题】:C++ Difference between Pointer and &Pointer [duplicate] 【发布时间】:2021-10-03 00:29:52 【问题描述】:所以我对 C++ 有点陌生,我有以下代码:
DWORD64 dwPointer = 0;
long test1 = dwPointer; //equals 0
LPVOID test2 = (LPVOID)dwPointer; //equals 0x0000000000000000
LPVOID test3 = &dwPointer; //equals 0x000000a5038ff068 (result changes after each restart)
所以如果我调试它,test1 和 test2 基本上都等于 0。 但是为什么每次我重新启动程序时test3的值都会改变。 指针的 & 前面有什么作用?
还可以在 C# 中复制完全相同的示例吗?我必须使用哪个代码,我只是想了解发生了什么,因为我是 C# 用户,我想知道预定义的 DWORD64 = 0 值如何在每次重新启动后更改为不同的值,即使没有在代码中分配这些新值?
【问题讨论】:
dwPointer
是一个 DWORD64
(在窗口 API,IIRC 中通常是 unsigned long
),值为零。 (LPVOID)dwPointer
将该零值转换为指针,因此产生一个空指针。 &dwPointer
是 dwPointer
在内存中的地址,即变量的值为零,并且在内存中的地址(不会为零)。您的代码不会更改dwPointer
的值,并且在“重新启动”之后不会更改。然而,该变量的地址取决于操作系统如何为进程分配内存。
“也可以在 C# 中复制完全相同的示例吗?” 没有。
“预定义的 DWORD64 = 0 值如何更改为不同的值” - 正如您所演示的那样,它不会。每次使用DWORD64
值(称为dwPointer
)时,该值都为零。当您将运算符应用于dwPointer
,特别是&
运算符时,您会得到不同的结果。大多数运算符的目的是将一个值转换为其他值,因此operator&
产生的值不是dwPointer
也就不足为奇了。 (结果值随每次重启而变化的事实可能令人惊讶,但结果不为零这一事实并不令人惊讶。)
在 c# 中,您可以使用 Marshaling 类来处理非托管内存。
【参考方案1】:
&dwPointer
得到dwPointer自己的地址(一个新的指针指向dwPointer的位置)。
【讨论】:
以上是关于C++指针和&Pointer之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章
C++ - “!pointer”和“pointer == nullptr”之间的区别?