我正在阅读与硬件寄存器接口的C程序。此人一直使用十六进制数字作为数组的索引,例如:
app_base_add[0x30]
我知道a [i]表示*(a + i)是*(a +(i * sizeof( typeof (a))))所以十六进制索引可能是偏移量app_base_add中地址空间中所需的内存位置。
这是对的吗? 而且还说:
#define mm2s_start_add 0xc0000000;
这些作业在使用中会如何相互不同?
volatile unsigned int *app_base_add;
app_base_add[0x30>>2]=0x1;
app_base_add[0x30>>2]=1<<2;
app_base_add[0x30>>2]=((unsigned int)mm2s_start_add); //is this assignment valid??
app_base_add[0x30>>2]=((unsigned int *)mm2s_start_add);
答案 0 :(得分:2)
写入0x30或48作为索引没有区别,如果说他的内存文档只是用十六进制值编写,那么对程序员来说可能更容易阅读,但这只是一个品味问题。
e.g。
app_base_add[0x30>>2]=0x1;
is the same as writing app_base_add[12]=0x1;
or even app_base_add[0x0C]=0x1;
答案 1 :(得分:1)
在编译时,所有值都以相同的方式处理,即使它们是用十六进制,二进制或十进制编写的。
0x2a == 42 == b101010 == 052
可以发出警告的唯一分配是施放到unsigned int
,因为您的目的地类型不是unsigned int
答案 2 :(得分:0)
volatile unsigned int *app_base_add;
//app_base_add is a pointer to volatile memory(not initialized :()
app_base_add[0x30>>2]=0x1;
// = app_base_add[12] = 1;
app_base_add[0x30>>2]=1<<2;
// = app_base_add[12] = 4;
app_base_add[0x30>>2]=((unsigned int)mm2s_start_add); //is this assignment valid??
// yes its valid
// = app_base_add[12] = 3221225472
app_base_add[0x30>>2]=((unsigned int *)mm2s_start_add);
// = app_base_add[12] = interpret 3221225472 as an unsigned integer pointer and store it.