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

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

【讨论】:

以上是关于C++指针和&Pointer之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++ - “!pointer”和“pointer == nullptr”之间的区别?

“C++ void Pointer”和“C# var”之间的区别

Go语言:指针和unsafe.Pointer有什么区别?

C++ 指针、引用和函数调用

在c ++函数中返回地址和返回指针之间的区别[重复]

Go 语言指针符号 * 和 & (pointer)