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

请教关于指针的一个问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
请教关于指针的一个问题
9 ^- X" c  F: k) c( y$ o7 t, @3 D4 c$ B7 W' ?/ ~# d3 `' B  ^) o
1、(unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
# Z# b' m/ L' H/ M" ?8 t* C/ A*0x20000000=2,表示的是将2放到0x20000000这个地址中?
2 {0 r5 h" `# D( U9 O2、(unsigned long*)0x20000000=2;这个赋值是错误的吧?
% s! ], y* P! a8 c' q+ R2 |  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?
) g# P5 v3 u1 y' K3、define  P(unsigned long*)0x20000000 ;1 p1 x/ }+ q7 o( A) X9 Z
     *P=2;$ z6 O6 v8 ]8 x. @

1 Y$ [# w  B# o3 O. Y- tDefine P *(unsigned long*)0x20000000;
, }& X- i1 M) Y8 z      P=2;1 X; }/ _; P$ d) V
这两者是等价的吧?% z0 s0 Y6 S2 M

该用户从未签到

2#
发表于 2019-3-21 09:54 | 只看该作者
个人观点、:1 ()是一个类型强制转换运算符,意思是将0x20000000强制转换成指针类型。
, l, l' i$ F* `: Q: W4 a9 F                  2  第一种写法好像没见过,应该是错误的,第二种应该是正确的" Z9 R% L. i6 E" _/ D
                  3  不等价,第一种写法是正确的,第二种写法是错误的

该用户从未签到

3#
发表于 2019-3-21 10:00 | 只看该作者
一个个来:, Q" l7 Z; |1 T0 U
1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?) x4 P0 W* d$ G/ F1 H  v/ w
*0x20000000=2,表示的是将2放到0x20000000这个地址中?
  ?8 {% B% G$ ?5 R, j8 M答:(unsigned long*)0x20000000的意思,和楼上意见一致,就是强制类型转换,将0x20000000强制转换为指针,至于' e) E& @- s9 J1 u- z0 Q  b; W
*0x20000000=2,首先这个写法就是错误的,就算理解为将2放到0x20000000这个地址中,但是对于指向0x20000000这个地址的指针类型并没有指定,所以这个写法有问题,如果写为:*(unsigned long*)0x20000000 = 2;这就和过程说的那个意思一致了。/ L, b6 |, q9 ^* X- O

% I0 N2 B+ Y2 `2(unsigned long*)0x20000000=2;这个赋值是错误的吧?
  r$ R' F. ~) v, c  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?3 `# `7 q0 L4 {9 y4 r; _
答:(unsigned long*)0x20000000=2;这个赋值的确是错误的,为什么错误,1中已经说过(unsigned long*)0x20000000是将0x20000000强制类型转换为指针,这里的这句代码在字面理解就是讲刚刚强制转换的一个指向0x20000000的指针转换为一个指向地址为0x2的地址的指针。这个是不允许的。
( V4 q7 r% ^  R* x2 I那么这句代码要怎么样就对了呢?改为 *(unsigned long*)0x20000000=2;就对了,为什么对?. |. a, T# P) R: ]
刚才说了(unsigned long*)0x20000000已经相当于一个指针了,通过*号取指针指向地址的值就可以进行操作该地址处的数据了。6 @5 N3 t" @- ?+ r
/ b% H" f) ^6 O
3 define  P(unsigned long*)0x20000000 ;
/ }$ i9 Z6 l/ }& _     *P=2;8 K' o8 r' r! C5 m
6 {+ [* i9 q" E$ x: o
Define P *(unsigned long*)0x20000000;
( x1 [, }4 f7 k      P=2;
' U3 l) m5 o. _+ u% v/ G  b; r( \1 d答:这两句话是等价的(麻烦把代码写对,前面漏了#号,后面多了;号),为什么对?$ B; N# [) s9 e3 b: X: l
宏就是替换的作用,上面两种写法就是把代码放在不同地方而已,并没有什么不同。
' G( e. ~) N9 B$ {) `! e# k0 b% i8 h; ?$ ?  s6 p
最后,以上解答均经过验证。有疑问随时反馈。

点评

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

该用户从未签到

4#
 楼主| 发表于 2019-3-21 10:05 | 只看该作者
helendcany 发表于 2019-3-21 10:00/ f) c8 e# _+ K: L
一个个来:
, [+ k' r$ d7 {4 B9 v6 ^1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
* B2 v8 |8 u3 N! f5 d*0x ...

; R3 N6 v  T. ~0 p8 ~: x4 i2 |& a' j(unsigned long*)0x20000000;0 |7 h1 E2 x! U, w3 V) y
*0x20000000=2;
  o* J4 r5 M% q6 H; t2 \这样赋值是正确的吧?
& t, N; D0 q% h, ?

点评

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

该用户从未签到

5#
发表于 2019-3-21 10:17 | 只看该作者
十一月 发表于 2019-3-21 10:05
8 M2 X. [: L- v(unsigned long*)0x20000000;) R* j- Z; y. T: K7 z; P. d
*0x20000000=2;
( P9 j2 G. ?3 o6 N, d) _这样赋值是正确的吧?

, R) l' l( f% n) a* j0 m$ [3 m) Y你给我解释下你为什么觉得正确
* u9 T# p8 d' S; \2 j: ]

点评

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

该用户从未签到

6#
 楼主| 发表于 2019-3-21 10:38 | 只看该作者
helendcany 发表于 2019-3-21 10:17
- |( i8 n7 j* O4 M你给我解释下你为什么觉得正确
' t( b& X) T0 g- \
我是把0x20000000类似于这样
9 r' M! O. U: }int *p;8 r' g# h" J  s2 ^$ I5 W
*p=2;
& q* @3 W% D0 _5 L不懂0x20000000 和指针一起搭配的用法
0 k* A. A3 x) p7 U. q* X

点评

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( R3 @8 i- c4 Y6 r' D
我是把0x20000000类似于这样
2 X5 x$ u) T: P, E' \. E4 oint *p;* j% D7 _2 x5 B
*p=2;
7 e/ ]% P- m* N. c9 D
0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要按照之前提到过的进行强制类型转换,就比如转换为(int *)0x20000000,这样就和int  *p一样都是指针了。
- r9 N6 {) o4 B0 r可能会有点绕,自己多多体会就懂了
5 f) W  ?' Z% w# W6 G% m

点评

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

该用户从未签到

8#
 楼主| 发表于 2019-3-21 11:19 | 只看该作者
helendcany 发表于 2019-3-21 11:18: N0 U0 g3 P# T# X: a* C
0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要 ...

: \0 M1 @& \0 t' r& V3 U) ~4 w) b谢谢了
7 U6 o% N7 M9 B2 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 06:29 , Processed in 0.078125 second(s), 31 queries , Gzip On.

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

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

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