Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59699
  • 博文数量: 8
  • 博客积分: 189
  • 博客等级: 入伍新兵
  • 技术积分: 114
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-15 15:23
文章分类

全部博文(8)

文章存档

2012年(8)

我的朋友

分类: LINUX

2012-11-25 17:36:02

对于(volatile unsigned char *)0x20我们再分析一下,它是由两部分组成:

1)(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。

2)volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。例如用while((unsigned char *)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 则要求每次都去读0x20的实际值。

那么(volatile unsigned char *)0x20是一个固定的指针,是不可变的,不是变量。而char   *u则是个指针变量。

再在前面加"*",*(volatile unsigned char *)0x20则变成了变量(普通的unsigned char变量,不是指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与unsigned char i是一样了,只不过前面的i的地址是固定的。

那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量。

以上是我在网上找的答案,也让我豁然开朗起来,,在给做ARM嵌入式驱动程序的时候,很多寄存器的地址的,以及这个地址内容的读写,在声明的时候用到volatile unsigned int* ,,,这个也算是对C语言指针用法的一个体现。

阅读(931) | 评论(0) | 转发(0) |
0

上一篇:pthread_atfork()中函数运行顺序

下一篇:没有了

给主人留下些什么吧!~~