1

我正在阅读一个与硬件寄存器接口的 C 程序。该人一直在使用十六进制数字作为数组的索引,例如:

app_base_add[0x30]  

我知道 a[i] 表示 *(a+i) 即 *(a+(i*sizeof( typeof (a)))) 所以十六进制索引可能是地址空间中所需内存位置的偏移量 wrt 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);
4

3 回答 3

2

将 0x30 或 48 作为索引写入没有区别,如果说他的内存文档仅使用十六进制值编写,程序员可能更容易阅读,但这只是个人喜好问题。

例如

app_base_add[0x30>>2]=0x1; 
is the same as writing app_base_add[12]=0x1; 
or even app_base_add[0x0C]=0x1; 
于 2012-10-19T11:44:02.340 回答
1

在编译时,所有值都以相同的方式处理,即使它们是以十六进制、二进制或十进制编写的。

0x2a == 42 == b101010 == 052

唯一可能引发警告的分配是强制转换为unsigned int,因为您的目标类型不是unsigned int

于 2012-10-19T11:45:31.707 回答
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.

于 2012-10-19T11:44:31.767 回答