重命名(别名)数组元素C.

不确定什么是“良好做法”或被认为更“正确”。 我有一个数组,我想通过arrayname []以外的名称访问各个元素。 我可以使用#defines或指针,也可能使用其他方式。

例:

#define value1 myarray[1] int myarray[SIZE]; value1 = 5; 

要么

 int myarray[SIZE]; int *ptr; ptr = &myarray[1]; *ptr = 5; 

在我看来,#define路径更简单,使用更少的内存,但可能会带来一些我不知道的问题。 任何见解都会很棒,我希望尽可能保持我的代码遵循通用的标准。

*编辑:也许有一个更好的方式。 我的最终目标是获得一个将发送出外围端口的arrays。 但是,数据由非常不同的数据集组成,并且单个arrays名称不代表所分配的数据。 我的记忆非常有限,所以我想避免双重存储每个值。

我提出了第三种选择,例如:

 #define VALUE1_IDX 1 int myarray[SIZE]; myarray[VALUE1_IDX] = 5; 

超过#1的优势在于你显然使用了myarray,而且优于#2的优点就像你说的那样,避免使用指针。 我怀疑,但尚未validation,通过优化,选项#2将没有额外的内存使用,尽管它看起来很直观。

我认为最好的解决方案会因情况而异,我认为在正确的背景下,您的两个选项中的任何一个都是可以防御的。

编辑:为了回应Kevin的评论,首先还要检查当你没有集体处理这些值时是否可以避免使用数组。 我意识到肯定存在不适用的情况,例如,如果你阅读一条长信息并想简单地提取几个关键值。

为什么不参考?

 int A[3]; int& a1=A[1]; 

union是另一种别名变量的方法。 但是不要把它作为推荐。 如果您依赖别名,它们是危险的(不可移植的)。 对于您不需要同时使用的变量,您应该只使用它们来优化内存使用。

 enum {SIZE = 100}; struct Mapping { int unused1; int value1; int unused2; }; Mapping& AsMapping( int(&array)[SIZE] ) { return *reinterpret_cast(&array); } int arr[SIZE]; AsMapping(arr).value1 = 5; Mapping& values = AsMapping(arr); values.value1 = 5; 

这需要紧接着没有内存,优化器应该能够擦除所有内容。 同时,它是合理可维护的。

struct上设置对齐可能是您必须要小心的要求。

你可以这样做

 typedef enum { foo = 0; // ... more named values bar = SIZE; } Thing; int value[SIZE]; value[foo] = 5; 

使用枚举作为数组索引

非定义方法允许您从第二种方法中获得一定程度的类型校正。

此外,任何理智编译器生成的实际代码对于两者都是相同的。

所有我都喜欢第二,因为它立刻显而易见的是正在发生的事情。 另一个问题是#define可能会导致您实际处理区域范围之外的问题。

使用后者更为明智,因为这意味着其他人不太可能会出现并在以后的情况下弄乱它……