对于(volatileunsignedchar*)0x20我们再分析一下,它是由两部分组成:
1)(unsignedchar*)0x20,0x20只是个值,前面加(unsignedchar*)表示0x20是个地址,而且这个地址类型是unsignedchar,意思是说读写这个地址时,要写进unsignedchar的值,读出也是unsignedchar。
2)volatile,关键字volatile确保本条指令不会因C编译器的优化而被省略,且要求每次直接读值。例如用while((unsignedchar*)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile则要求每次都去读0x20的实际值。
那么(volatileunsignedchar*)0x20是一个固定的指针,是不可变的,不是变量。而char*u则是个指针变量。
再在前面加"*": *(volatileunsignedchar*)0x20则变成了变量(普通的unsignedchar变量,不是指针变量),如果#definei(*(volatileunsignedchar*)0x20),那么与unsignedchari是一样了,只不过前面的i的地址是固定的。
那么,(*(volatileunsignedchar*)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量。