在C中使用数组索引中的十六进制值

时间:2012-10-19 11:35:14

标签: c arrays

我正在阅读与硬件寄存器接口的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);

3 个答案:

答案 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.