关于c++指针和内存地址的有关问题,比较蛋疼

关于c++指针和内存地址的问题,比较蛋疼

long n=0x004DE99B;
*(unsigned char *) (n)= 3 ;

或者
② 
#define n (0x004DE99B)
*(unsigned char *) (n)= 3 ;

上面2种写法意义是一样的吗?
是不是①只是把变量N的值从0x004DE99B变为3?
而②是把内存地址0x004DE99B对应的值变为3?

------解决方案--------------------
2种写法,效果基本上等价的(都是把内存地址0x004DE99B对应的1Byte值变为3);
建议用第一种,第二种多了的话,容易宏冲突。
------解决方案--------------------
是一样的.
------解决方案--------------------
第一个的汇编
Assembly code
    *(unsigned char *) (n)= 3 ;
00411535  mov         eax,dword ptr [n] 
00411538  mov         byte ptr [eax],3

------解决方案--------------------
两种写法都是把“内存地址0x004DE99B对应的值变为3”即你对2的解释,1的解释是错误的。
另外2用到了宏,实质上是:
*(unsigned char *)(0x004DE99B)= 3;
有个小区别是0x004DE99B这个字面量是int类型的。