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

C++ 重命名(别名)数组元素C,c++,c,C++,C,不确定什么是“良好实践”或被认为更“正确”。我有一个数组,我想通过名称而不是arrayname[]访问单个元素。我可以使用#定义或指针,可能还有其他方法 例如: #define value1 myarray[1] int myarray[SIZE]; value1 = 5; 或 在我看来#define路径更简单,占用的内存更少,但可能会带来一些我不知道的问题。任何洞察都将是伟大的,我希望我的代码尽可能遵循普遍接受的标准 *编辑:也许有更好的方法。我的最终目标是获得一个将被发送到外围端口的阵列

不确定什么是“良好实践”或被认为更“正确”。我有一个数组,我想通过名称而不是arrayname[]访问单个元素。我可以使用#定义或指针,可能还有其他方法

例如:

#define value1 myarray[1]

int myarray[SIZE];
value1 = 5;

在我看来#define路径更简单,占用的内存更少,但可能会带来一些我不知道的问题。任何洞察都将是伟大的,我希望我的代码尽可能遵循普遍接受的标准


*编辑:也许有更好的方法。我的最终目标是获得一个将被发送到外围端口的阵列。但是,数据由非常不同的数据集组成,单个数组名称不能代表所分配的数据。我的内存非常有限,因此我希望避免重复存储每个值。

我建议第三个选项,举例来说:

#define VALUE1_IDX  1

int myarray[SIZE];
myarray[VALUE1_IDX] = 5;
与#1相比,它的优势在于,很明显您正在使用myarray,而与#2相比,它的优势在于,正如您所说,避免使用指针。我可能会怀疑,但还没有证实,通过优化,选项#2将不会有额外的内存使用,尽管从直觉上看它会这样做

我认为最好的解决办法会因情况而异,我认为你的两个选择中的任何一个在正确的背景下都是站得住脚的


编辑:为了回应Kevin的评论,首先值得检查的是,当您不集体处理值时,是否可以避免使用数组。我意识到,在某些情况下,这当然不适用,例如,如果您阅读了一条很长的消息,只想提取几个键值。

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

您可以这样做

typedef enum
{
    foo = 0;
    // ... more named values
    bar = SIZE;
} Thing;

int value[SIZE];
value[foo] = 5;

为什么不引用

int A[3];  
int& a1=A[1];
enum{SIZE=100};
结构映射{
国际未用1;
int值1;
国际大学2;
};
映射和AsMapping(整数和数组)[SIZE]){
return*reinterpret_cast(&array);
}
int arr[尺寸];
AsMapping(arr).值1=5;
映射和值=映射(arr);
值1=5;
这几乎不需要内存,优化器应该能够擦除所有内容。同时,它具有合理的可维护性


结构上设置对齐方式可能是您必须小心的一项要求。

非定义方法允许您达到第二次使用时无法达到的类型更正程度

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

总的来说,我更喜欢第二种,因为这是显而易见的事情。另一个问题是#define可能会导致超出实际处理范围的问题


使用后者更为明智,因为这意味着不太可能有其他人在以后的场合出现并把事情搞砸……

神圣的维护噩梦,蝙蝠侠!你为什么要这么做?理性是什么?我觉得,如果一个值需要一个与数组中所有其他值不同的标识,那么该值首先不应该在数组中。你能提供一个更具体的例子来证明你的想法的实用性吗?相关:这肯定会成为一场噩梦。你为什么要这么做?这看起来很有希望,很明显我不知道为什么我没有想到。保持数组名为常规,但使用描述性索引值可以得到我想要的结果。感谢您的输入。联合不允许您对先前存在的变量进行别名。此外,使用联合使对象彼此别名可能(取决于类型)违反严格的别名规则,而且由于一次只有一个联合成员处于“活动”状态的规则,因此也有问题。
int A[3];  
int& a1=A[1];
enum {SIZE = 100};

struct Mapping {
  int unused1;
  int value1;
  int unused2;
};

Mapping& AsMapping( int(&array)[SIZE] ) {
  return *reinterpret_cast<Mapping*>(&array);
}

int arr[SIZE];
AsMapping(arr).value1 = 5;
Mapping& values = AsMapping(arr);
values.value1 = 5;