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

请教关于指针的一个问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
请教关于指针的一个问题. }; L3 {6 z4 p+ G; F6 s

& k2 [$ p( B0 x+ {3 v1、(unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
3 h9 T, R' p' P6 |, U' O7 J*0x20000000=2,表示的是将2放到0x20000000这个地址中?
* U) h; D8 g9 W' _. b5 s3 `2、(unsigned long*)0x20000000=2;这个赋值是错误的吧?
9 `% }6 N: B5 I' f1 V; t" p4 m, x  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?0 Y. t  e  z0 I1 |5 {3 h
3、define  P(unsigned long*)0x20000000 ;
. i+ G4 M6 h3 i     *P=2;  |; Z2 M$ }; B; l9 {* w1 h

: c8 e) u) O8 DDefine P *(unsigned long*)0x20000000;
1 r8 s4 D# r* I3 F+ }0 w* |" Q      P=2;& w' e2 x% {8 y* [" f# G" Z- z
这两者是等价的吧?
' [: B6 t- ^0 M  o% `: C4 u

该用户从未签到

2#
发表于 2019-3-21 09:54 | 只看该作者
个人观点、:1 ()是一个类型强制转换运算符,意思是将0x20000000强制转换成指针类型。
+ |, m1 O0 @# U" A1 A8 J% |" m0 i7 }6 F                  2  第一种写法好像没见过,应该是错误的,第二种应该是正确的+ X6 Z1 Q6 b* p, _" x: ~0 i  I- S
                  3  不等价,第一种写法是正确的,第二种写法是错误的

该用户从未签到

3#
发表于 2019-3-21 10:00 | 只看该作者
一个个来:' 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
最后,以上解答均经过验证。有疑问随时反馈。

点评

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

该用户从未签到

4#
 楼主| 发表于 2019-3-21 10:05 | 只看该作者
helendcany 发表于 2019-3-21 10:00
6 K/ A' g# e% ~一个个来:6 a" c, _# h4 r" Z3 x2 y
1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
7 i: h; v3 S, ^9 F& Z  h*0x ...

# N0 n* i7 v- l( B(unsigned long*)0x20000000;1 p( P" G$ m# d" ~' Q6 m( h: z
*0x20000000=2;
9 |' L+ P% I- E, K; O0 m这样赋值是正确的吧?$ `4 j$ M9 j7 _& A6 i

点评

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

该用户从未签到

5#
发表于 2019-3-21 10:17 | 只看该作者
十一月 发表于 2019-3-21 10:054 a% x% _0 Q( N# n
(unsigned long*)0x20000000;
7 f- [2 {/ w- H# I*0x20000000=2;" m% y0 e% \5 ?1 ~! o: h1 e: f
这样赋值是正确的吧?

1 x* M4 f- @9 n/ A你给我解释下你为什么觉得正确
( c3 U5 S, L; K. B3 w

点评

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

该用户从未签到

6#
 楼主| 发表于 2019-3-21 10:38 | 只看该作者
helendcany 发表于 2019-3-21 10:17
% l. `% u+ e- d: W- ~& R# O你给我解释下你为什么觉得正确
0 b& w. s+ F5 {0 N! h
我是把0x20000000类似于这样
6 p; w- |' j( m; j% `int *p;1 K4 Z  E# j% y% I
*p=2;
9 ^0 l" C" ], [7 F不懂0x20000000 和指针一起搭配的用法
/ ]5 R* a  `: y9 j

点评

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( H6 N* H$ ^- \3 U$ y2 Q
我是把0x20000000类似于这样9 ?+ I# U+ M" ?0 a
int *p;
) q" `/ O7 F1 y7 t7 `9 t*p=2;
$ i6 i2 p/ k* _
0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要按照之前提到过的进行强制类型转换,就比如转换为(int *)0x20000000,这样就和int  *p一样都是指针了。' c+ q+ d  F9 e# @8 |- a4 i
可能会有点绕,自己多多体会就懂了
/ ?/ u5 }1 \1 U9 u/ g5 Q

点评

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

该用户从未签到

8#
 楼主| 发表于 2019-3-21 11:19 | 只看该作者
helendcany 发表于 2019-3-21 11:18: Q$ e% m. Q  v* P7 D7 m* Z
0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要 ...
3 R. K) e+ L5 G
谢谢了7 i) z5 U9 _) h( j5 e; g/ Z7 g  n
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-24 01:24 , Processed in 0.125000 second(s), 32 queries , Gzip On.

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

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

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