【问题标题】:C++ Difference between Pointer and &Pointer [duplicate]C++指针和&Pointer之间的区别[重复]
【发布时间】: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 将该零值转换为指针,因此产生一个空指针。 &dwPointerdwPointer 在内存中的地址,即变量的值为零,并且在内存中的地址(不会为零)。您的代码不会更改dwPointer 的值,并且在“重新启动”之后不会更改。然而,该变量的地址取决于操作系统如何为进程分配内存。
  • “也可以在 C# 中复制完全相同的示例吗?” 没有。
  • “预定义的 DWORD64 = 0 值如何更改为不同的值” - 正如您所演示的那样,它不会。每次使用DWORD64 值(称为dwPointer)时,该值都为零。当您将运算符应用于dwPointer,特别是& 运算符时,您会得到不同的结果。大多数运算符的目的是将一个值转换为其他值,因此operator& 产生的值不是dwPointer 也就不足为奇了。 (结果值随每次重启而变化的事实可能令人惊讶,但结果不为零这一事实并不令人惊讶。)
  • 在 c# 中,您可以使用 Marshaling 类来处理非托管内存。

标签: c++ pointers


【解决方案1】:

&dwPointer得到dwPointer自己的地址(一个新的指针指向dwPointer的位置)。

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多