【发布时间】:2012-10-19 11:35:13
【问题描述】:
我正在阅读一个与硬件寄存器接口的 C 程序。该人一直在使用十六进制数字作为数组的索引,例如:
app_base_add[0x30]
我知道 a[i] 表示 *(a+i) 即 *(a+(i*sizeof(typeof(a)))) 所以十六进制索引可能是地址空间中所需的内存位置 w.r.t 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);
【问题讨论】:
-
无论你用十六进制还是十进制(或者八进制,如果你愿意)写索引对编译器没有影响。没有任何。最后一个赋值有点问题,因为您首先将一个整数转换为一个指针,然后将该指针转换回一个整数。如果编译器是宽松的,它可以按原样编译它,否则你需要在转换为指针类型后显式转换为整数类型。
-
@DanielFischer:十六进制和十进制确实会对编译器产生影响。这在数组索引中不太重要,但可能会产生影响。请参阅我对以下答案之一的评论。
-
@EricPostpischil 对,如果您想要负索引,您可能需要使用十六进制表示法显式转换为有符号类型。虽然重要的案例很少,但我应该提到它。