You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中pointer与&pointer的区别及对应C#实现方式咨询

问题解答

1. C++中变量前&符号的作用

这里的&是C++的取地址运算符,作用是获取目标变量在内存中的存储地址,而非变量本身存储的数值。
你给出的示例中三个变量的本质区别为:

  • test1:直接读取dwPointer中存储的数值,因为dwPointer初始赋值为0,所以取值为0
  • test2:将dwPointer存储的数值强制转换为无类型指针,数值还是0,所以得到空指针0x0
  • test3:获取dwPointer这个变量本身在内存中的存放地址,和dwPointer里存的0没有任何关联

2. C#对应复现代码

C#默认是安全运行上下文,不允许直接操作指针,要复现上述逻辑需要使用不安全代码,首先要在项目编译选项中开启「允许不安全代码」,对应代码如下:

unsafe static void Main(string[] args)
{
    // ulong对应C++的DWORD64(64位无符号整数)
    ulong dwPointer = 0;
    long test1 = (long)dwPointer; // 取值为0
    // IntPtr对应C++的LPVOID(指针类型)
    IntPtr test2 = (IntPtr)dwPointer; // 取值为0x0000000000000000
    IntPtr test3 = (IntPtr)(&dwPointer); // 取变量内存地址,每次运行值不同

    Console.WriteLine($"test1: {test1}");
    Console.WriteLine($"test2: 0x{test2:X16}");
    Console.WriteLine($"test3: 0x{test3:X16}");
}

3. 地址每次重启程序变化的原因

这个现象和变量本身存储的数值无关,是操作系统的**地址空间布局随机化(ASLR)**安全机制导致的:
现在主流操作系统(Windows、Linux、macOS)默认都会开启ASLR,程序每次启动时,操作系统会随机偏移程序的栈、堆、核心模块的加载基址,避免攻击者利用固定内存地址执行漏洞利用代码。
你的示例中dwPointer是栈上的局部变量,程序每次启动时栈的基地址都会被ASLR随机调整,所以这个变量的存储地址每次运行都会发生变化。

内容的提问来源于stack exchange,提问作者Discord Programs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:39:00