微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于指针的一个问题

关于指针的一个问题

时间:10-02 整理:3721RD 点击:
1、(unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
*0x20000000=2,表示的是将2放到0x20000000这个地址中?
2、(unsigned long*)0x20000000=2;这个赋值是错误的吧?
  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?
3、define  P(unsigned long*)0x20000000 ;
     *P=2;

Define P *(unsigned long*)0x20000000;
      P=2;
这两者是等价的吧?

一个个来:
1 (unsigned long*)0x20000000;这个语句指的是什么意思?是把0x20000000定义成指针吗?
*0x20000000=2,表示的是将2放到0x20000000这个地址中?
答:(unsigned long*)0x20000000的意思,和楼上意见一致,就是强制类型转换,将0x20000000强制转换为指针,至于
*0x20000000=2,首先这个写法就是错误的,就算理解为将2放到0x20000000这个地址中,但是对于指向0x20000000这个地址的指针类型并没有指定,所以这个写法有问题,如果写为:*(unsigned long*)0x20000000 = 2;这就和过程说的那个意思一致了。
2(unsigned long*)0x20000000=2;这个赋值是错误的吧?
  *(unsigned long*)0x20000000=2 这样赋值是正确的吧?
答:(unsigned long*)0x20000000=2;这个赋值的确是错误的,为什么错误,1中已经说过(unsigned long*)0x20000000是将0x20000000强制类型转换为指针,这里的这句代码在字面理解就是讲刚刚强制转换的一个指向0x20000000的指针转换为一个指向地址为0x2的地址的指针。这个是不允许的。
那么这句代码要怎么样就对了呢?改为 *(unsigned long*)0x20000000=2;就对了,为什么对?
刚才说了(unsigned long*)0x20000000已经相当于一个指针了,通过*号取指针指向地址的值就可以进行操作该地址处的数据了。
3 define  P(unsigned long*)0x20000000 ;
     *P=2;

Define P *(unsigned long*)0x20000000;
      P=2;
答:这两句话是等价的(麻烦把代码写对,前面漏了#号,后面多了;号),为什么对?
宏就是替换的作用,上面两种写法就是把代码放在不同地方而已,并没有什么不同。
最后,以上解答均经过验证。有疑问随时反馈。

个人观点、:1 ()是一个类型强制转换运算符,意思是将0x20000000强制转换成指针类型。
                  2  第一种写法好像没见过,应该是错误的,第二种应该是正确的
                  3  不等价,第一种写法是正确的,第二种写法是错误的,

(unsigned long*)0x20000000;
*0x20000000=2;
这样赋值是正确的吧?

你给我解释下你为什么觉得正确

我是把0x20000000类似于这样
int *p;
*p=2;
不懂0x20000000 和指针一起搭配的用法

我是把0x20000000类似于这样
int *p;
*p=2;
不懂0x20000000 和指针一起搭配的用法

我是把0x20000000类似于这样
int *p;
*p=2;
不懂0x20000000 和指针一起搭配的用法

0x20000000只是一个立即数,而你说的int *p;这句代码中的p是个指针,这两个不是等价的,如果要等价就要按照之前提到过的进行强制类型转换,就比如转换为(int *)0x20000000,这样就和int  *p一样都是指针了。
可能会有点绕,自己多多体会就懂了

学习

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top