|
一个个来:' e+ B, u& J/ q' e$ i, v* v
1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
* _) a7 H2 L& t2 x5 w/ ]: y*0x20000000=2,表示的是将2放到0x20000000这个地址中?9 C" p5 r; ]. ?% {% |" Z5 s
答:(unsigned long*)0x20000000的意思,和楼上意见一致,就是强制类型转换,将0x20000000强制转换为指针,至于
. Z s9 W0 c0 Y I4 m*0x20000000=2,首先这个写法就是错误的,就算理解为将2放到0x20000000这个地址中,但是对于指向0x20000000这个地址的指针类型并没有指定,所以这个写法有问题,如果写为:*(unsigned long*)0x20000000 = 2;这就和过程说的那个意思一致了。
* ~8 F- V2 g/ F& s- `0 r. y4 R( ~' i8 ~8 c9 `% k6 ]. x2 K
2(unsigned long*)0x20000000=2;这个赋值是错误的吧?
% }0 ]+ _& K8 v3 p) A" m, [, j& X4 w7 d *(unsigned long*)0x20000000=2 这样赋值是正确的吧?/ w- W: r: U' V% Y/ y8 a/ q; p
答:(unsigned long*)0x20000000=2;这个赋值的确是错误的,为什么错误,1中已经说过(unsigned long*)0x20000000是将0x20000000强制类型转换为指针,这里的这句代码在字面理解就是讲刚刚强制转换的一个指向0x20000000的指针转换为一个指向地址为0x2的地址的指针。这个是不允许的。
* V! D8 m9 {7 P! }- c/ A6 Y# C& D那么这句代码要怎么样就对了呢?改为 *(unsigned long*)0x20000000=2;就对了,为什么对?3 `) L# A+ o* k8 {' \, N% _
刚才说了(unsigned long*)0x20000000已经相当于一个指针了,通过*号取指针指向地址的值就可以进行操作该地址处的数据了。
( `1 I: n7 t! l
, k4 U. g0 ~ X5 r3 t' M6 U0 i3 define P(unsigned long*)0x20000000 ;
: a- s9 z8 [ r( @4 s3 x7 c/ e *P=2;
; q/ T" a& K8 l" N! ?/ `1 U与
2 ?6 V r' L* N; G) FDefine P *(unsigned long*)0x20000000;
! i r3 Q" g2 @- C P=2;
% m9 P z9 }) `4 b0 J" S答:这两句话是等价的(麻烦把代码写对,前面漏了#号,后面多了;号),为什么对?4 e6 @ {# b7 w& L5 |6 c( Q5 R
宏就是替换的作用,上面两种写法就是把代码放在不同地方而已,并没有什么不同。
" O4 z) U! s0 w# H# J3 {' T: p7 J5 f. e3 [" s6 F
最后,以上解答均经过验证。有疑问随时反馈。 |
|