找回密码
 注册
关于网站域名变更的通知
查看: 589|回复: 8
打印 上一主题 下一主题

请教关于指针的一个问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-21 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
请教关于指针的一个问题$ ]( Q0 h: K- [( a

0 |" a7 }6 ~. c2 C2 {7 m* D1、(unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
' Y2 _1 q& M0 D% e( s% s% t+ c/ Y*0x20000000=2,表示的是将2放到0x20000000这个地址中?) m* e3 }- J5 t" ?2 s
2、(unsigned long*)0x20000000=2;这个赋值是错误的吧?! z1 H+ X! Y, R! u+ c
  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?' W( {# [. z7 t$ n% B/ ^5 w* e! K
3、define  P(unsigned long*)0x20000000 ;
( z$ ~+ P" b7 K( m% J% J; D. {6 F     *P=2;0 y2 z' {! T: r; C6 {% N+ n
% n( j- S. j1 o2 S
Define P *(unsigned long*)0x20000000;6 R# R. z, X: k8 i1 h( S* b
      P=2;- a8 h( t  ?7 c4 |9 |' T
这两者是等价的吧?
# d+ b% \6 P( E/ o$ F: f0 w

该用户从未签到

2#
发表于 2019-3-21 09:54 | 只看该作者
个人观点、:1 ()是一个类型强制转换运算符,意思是将0x20000000强制转换成指针类型。
* {9 ], Q' T, |) F: C                  2  第一种写法好像没见过,应该是错误的,第二种应该是正确的: X' m4 U7 E! z, k8 E6 B% E
                  3  不等价,第一种写法是正确的,第二种写法是错误的

该用户从未签到

3#
发表于 2019-3-21 10:00 | 只看该作者
一个个来:) W7 K/ F0 n. D6 `5 v* T
1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?. U0 q; B! d, E: g! h6 s
*0x20000000=2,表示的是将2放到0x20000000这个地址中?# s' O) \, b7 h) v8 O
答:(unsigned long*)0x20000000的意思,和楼上意见一致,就是强制类型转换,将0x20000000强制转换为指针,至于
( k& R7 V8 \: L, ~*0x20000000=2,首先这个写法就是错误的,就算理解为将2放到0x20000000这个地址中,但是对于指向0x20000000这个地址的指针类型并没有指定,所以这个写法有问题,如果写为:*(unsigned long*)0x20000000 = 2;这就和过程说的那个意思一致了。- {- D! d& m3 J% C6 B, h# C- O
; s2 G3 I- T+ P  z4 A
2(unsigned long*)0x20000000=2;这个赋值是错误的吧?9 y2 f' ?0 O/ d
  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?0 J: h7 \. J" R! ^
答:(unsigned long*)0x20000000=2;这个赋值的确是错误的,为什么错误,1中已经说过(unsigned long*)0x20000000是将0x20000000强制类型转换为指针,这里的这句代码在字面理解就是讲刚刚强制转换的一个指向0x20000000的指针转换为一个指向地址为0x2的地址的指针。这个是不允许的。
& F4 T9 ~% {* ^那么这句代码要怎么样就对了呢?改为 *(unsigned long*)0x20000000=2;就对了,为什么对?
" ~' J4 V/ d+ K2 q6 g刚才说了(unsigned long*)0x20000000已经相当于一个指针了,通过*号取指针指向地址的值就可以进行操作该地址处的数据了。
; `: y# L& a  B9 R* I4 H. ]. @; S; b5 s
3 define  P(unsigned long*)0x20000000 ;! v9 e0 X/ C# N; L: N8 O
     *P=2;
. o3 E. Y$ E( Q" N4 [$ }
: N0 R7 R8 [2 ~; qDefine P *(unsigned long*)0x20000000;1 ^: d, `+ m& z8 m
      P=2;7 C, A  T! k& p0 S, }7 g; q, r+ r
答:这两句话是等价的(麻烦把代码写对,前面漏了#号,后面多了;号),为什么对?
: n' u& p/ M" ^+ i9 m' a5 A宏就是替换的作用,上面两种写法就是把代码放在不同地方而已,并没有什么不同。8 U6 W2 d- R) L9 y: v& u5 Q
- Y1 H  A1 m3 s5 E7 {! b5 @
最后,以上解答均经过验证。有疑问随时反馈。

点评

(unsigned long*)0x20000000; *0x20000000=2; 这样赋值是正确的吧?  详情 回复 发表于 2019-3-21 10:05

该用户从未签到

4#
 楼主| 发表于 2019-3-21 10:05 | 只看该作者
helendcany 发表于 2019-3-21 10:002 Z6 c  I0 C6 r, u. [, N+ V0 _) l
一个个来:) h0 K! V: K* l4 K& }! B2 L  M
1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
6 ~+ |/ x# b, }$ e. P" U- k*0x ...

9 `; E# B2 |" u/ A# K7 G2 @' Y(unsigned long*)0x20000000;
2 e& `# l6 u8 ]5 E9 y2 c% N*0x20000000=2;3 X0 [0 x5 [2 l9 f6 H
这样赋值是正确的吧?
' F6 u6 W* V" ?" N+ I8 Q

点评

你给我解释下你为什么觉得正确  详情 回复 发表于 2019-3-21 10:17

该用户从未签到

5#
发表于 2019-3-21 10:17 | 只看该作者
十一月 发表于 2019-3-21 10:05
  ], y0 x2 h4 p! s6 U# c(unsigned long*)0x20000000;
& |" {' D1 U! c8 @. L; j9 \  d*0x20000000=2;
) C. C4 h* ]3 L& B( G5 a8 u这样赋值是正确的吧?
* a1 e: y7 L) e% r! }
你给我解释下你为什么觉得正确' q' M- l4 f9 o# {# ^6 [

点评

我是把0x20000000类似于这样 int *p; *p=2; 不懂0x20000000 和指针一起搭配的用法  详情 回复 发表于 2019-3-21 10:38

该用户从未签到

6#
 楼主| 发表于 2019-3-21 10:38 | 只看该作者
helendcany 发表于 2019-3-21 10:17- R: ?; f7 [; w0 j2 F
你给我解释下你为什么觉得正确
& f$ Y# f8 Y2 h; z; W9 j
我是把0x20000000类似于这样# J9 E+ m) E) b, X6 H! ~
int *p;
9 b+ U8 R: D: q9 g* {*p=2;
- J$ m# |4 |0 `" [" N3 _) B5 i- M# s/ J不懂0x20000000 和指针一起搭配的用法
1 w) N2 n7 v, ?, \, P

点评

0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要按照之前提到过的进行强制类型转换,就比如转换为(int *)0x20000000,这样就和int *p一样都是指针了。 可能会  详情 回复 发表于 2019-3-21 11:18
0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要按照之前提到过的进行强制类型转换,就比如转换为(int *)0x20000000,这样就和int *p一样都是指针了。 可能会  详情 回复 发表于 2019-3-21 11:17

该用户从未签到

7#
发表于 2019-3-21 11:18 | 只看该作者
十一月 发表于 2019-3-21 10:38
/ z8 s  v8 P. }; ]8 I我是把0x20000000类似于这样" W5 p  \( A2 r9 J) w
int *p;
' p2 h% Y) w  n3 Z*p=2;

9 N2 t+ U, o1 J5 R0 @) o- X+ |  W, Y0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要按照之前提到过的进行强制类型转换,就比如转换为(int *)0x20000000,这样就和int  *p一样都是指针了。
9 X2 J; q$ V2 [) `- p3 x: M% @$ ^可能会有点绕,自己多多体会就懂了$ O; T# |5 q7 y: j3 S! m+ J2 D+ X

点评

谢谢了  详情 回复 发表于 2019-3-21 11:19

该用户从未签到

8#
 楼主| 发表于 2019-3-21 11:19 | 只看该作者
helendcany 发表于 2019-3-21 11:18
$ R5 U# C! I+ x+ C3 J& P& g0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要 ...
& t9 H( Y# ?* q7 p5 @7 \
谢谢了( R% `5 E7 `- ^! C' M5 `# u" ]5 a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-11 16:42 , Processed in 0.171875 second(s), 31 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表