重命名(别名)数组元素 C
Renaming (aliasing) array elements C
不确定什么是"良好做法"或被认为更"正确"。我有一个数组,我想通过 arrayname[] 以外的名称访问单个元素。我可以使用 #defines 或指针,可能还有其他方式。
例:
#define value1 myarray[1]
int myarray[SIZE];
value1 = 5;
或
int myarray[SIZE];
int *ptr;
ptr = &myarray[1];
*ptr = 5;
在我看来,#define 路线更简单,使用更少的内存,但可能会带来一堆我不知道的问题。任何见解都会很棒,我喜欢尽可能让我的代码遵循通用公认的标准。
*编辑:也许有更好的方法。我的最终目标是获得一个将从外围端口发送出去的阵列。但是,数据由非常不同的数据集组成,单个数组名称不能代表所分配的数据。我的内存非常有限,所以我想避免双重存储每个值。
我通过示例提出了第三个选项:
#define VALUE1_IDX 1
int myarray[SIZE];
myarray[VALUE1_IDX] = 5;
与 #1 相比,这样做的优势在于您仍然很明显正在使用 myarray,而与 #2 相比的优势是,就像您所说,避免使用指针。 我怀疑,但尚未验证,通过优化,选项 #2 不会有额外的内存使用,尽管它看起来很直观。
我认为最好的解决方案会因情况而异,我认为你的两个选项中的任何一个在正确的背景下都是可以辩护的。
编辑:为了呼应凯文的评论,首先值得检查一下,当你不集中处理值时,是否有可能避免使用数组。 我意识到肯定在某些情况下这不适用,例如,如果您阅读了一条长消息并想简单地提取几个关键值。
为什么不是引用?
int A[3];
int& a1=A[1];
union
s 是另一种为变量设置别名的方法。但不要将此视为建议。如果您依赖别名,它们是危险的(不可移植的)。您应该只使用它们来优化内存使用,对于您不需要的变量。
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;
这几乎不需要内存,优化器应该能够擦除所有内容。 同时,它是合理的可维护的。
在struct
上设置对齐方式可能是您必须小心的要求。
你可以做这样的事情
typedef enum
{
foo = 0;
// ... more named values
bar = SIZE;
} Thing;
int value[SIZE];
value[foo] = 5;
使用枚举作为数组索引
非定义方法允许您获得第二种方法无法获得的类型校正程度。
此外,任何健全的编译器生成的实际代码对于两者都是相同的。
总而言之,我更喜欢第二个,因为立即可以看到正在发生的事情。 另一个问题是,#define 可能会导致您实际处理的区域范围之外的问题。
使用后者更明智,因为这意味着其他人不太可能在以后的场合出现并搞砸它......
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 动态维度数组的 C++ 别名指针
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 数组元素的 c++ 别名
- 重命名(别名)数组元素 C
- c/c++中数组元素的别名