0

这是我所拥有的:

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;

但我觉得它相当不雅和不令人满意。所以,我的问题是:有更好的方法吗?

4

1 回答 1

0

第二种解决方案不仅“不优雅且不令人满意”,而且是未定义的行为。有关该主题的更多信息,请参阅此问题的答案。

第一个解决方案允许您使用负索引,因为ptr[index]相当于*(ptr + index),所以只要结果指向数组内,就可以了。

sizeof可以通过遵循设计者采用的方法来构建问题的解决方案std::array<T,size_t>:制作一个包装数组的模板类,并在其下标运算符中进行索引转换。

如果这不起作用,您可以返回原始两个解决方案的组合,但没有未定义的行为,如下所示:

#define MX 1000

typedef int arr_mx[MX];

int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));

这是ideone 上这种方法的演示。

于 2013-05-17T13:39:29.447 回答