在C中声明指针

时间:2016-01-28 21:23:43

标签: c pointers

在C中声明指针时, *(volatile unsigned char *)等同于仅使用 volatile unsigned char ?例如,会写

#define myMemoryLocation (*(volatile unsigned char *)(12345678))

与使用相同:

#define myMemoryLocation (volatile unsigned char)(12345678)

2 个答案:

答案 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。你会得到两者截然不同的结果。