这就是我所拥有的:
int t[MX];
现在,我想重写该代码,以便有效地将单个元素添加到该数组的开头,而不必在其余代码中将所有索引转换为1。该问题的解决方案可能是这样的:
int _t[MX+1];
int * const t = _t+1;
这种方法的问题在于,现在这样的东西不再起作用了:
memset(t, 0, sizeof t);
问题是sizeof t
会返回4,而不是我想要的MX * 4.
一种可能的解决方案可能是:
struct
{
int a;
int b[MX];
} _t;
int (&t)[MX] = _t.b;
但我发现它相当不优雅和令人不满意。 所以,我的问题是: 还有更好的方法吗?
答案 0 :(得分:0)
不仅第二种解决方案“不优雅且不令人满意”,它也是不确定的行为。有关该主题的更多信息,请参阅this question的答案。
第一个解决方案允许您使用负索引,因为ptr[index]
等同于*(ptr + index)
,因此只要结果指向数组内,您就可以了。
可以通过遵循std::array<T,size_t>
的设计者采用的方法来构建sizeof
问题的解决方案:创建一个包装数组的模板类,并在其下标运算符中进行索引转换。 / p>
如果这不起作用,您可以回到原来的两个解决方案的组合,但没有未定义的行为,如下所示:
#define MX 1000
typedef int arr_mx[MX];
int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));