在C中声明指针时, *(volatile unsigned char *)等同于仅使用 volatile unsigned char ?例如,会写
#define myMemoryLocation (*(volatile unsigned char *)(12345678))
与使用相同:
#define myMemoryLocation (volatile unsigned char)(12345678)
答案 0 :(得分:3)
让我们一步一步地分析你的第一个表达
您从int:12345678
演员(unsigned char *)(12345678)
会产生一个指针。这个指针指向一个内存地址12345678.如果你推荐这样一个指针,你会得到一个unsigned char
(volatile unsigned char *)(12345678)
是相同的指针,但是你告诉编译器这个指针指向的内存位置的值可以“单独”改变。
然后取消引用指针,因此*(volatile unsigned char *)(12345678))
是解释为unsigned char
的内存位置12345678的值。因为它是volatile
,所以每次取消引用指针时,编译器必须发出代码来读取内存位置;例如,它无法将位置缓存在寄存器中。
最后,您为此表达式指定一个符号名称#define myMemoryLocation (*(volatile unsigned char *)(12345678))
因此,每次在程序中使用myMemoryLocation
时,编译器都会发出代码以从内存地址读取无符号字符12345678
现在,让我们看看你的第二个表达。 (volatile unsigned char)(12345678))
。这只是一个不变的表达。如果系统上的unsigned char为一个字节长,则其值始终为0x4e(或十进制78)。
显然这两个表达方式非常不同。
答案 1 :(得分:2)
#define myMemoryLocation (*(volatile unsigned char *)(12345678))
与
相同#define myMemoryLocation (volatile unsigned char)(12345678))
第一个将12345678
视为内存中的地址,并计算存储在那里的任何值;第二个只是将整数值12345678
转换为volatile unsigned char
。你会得到两者截然不同的结果。