Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中填充数组+;不转换索引_C++_Arrays_Pointers_Syntax_Padding - Fatal编程技术网

C++ 在C+中填充数组+;不转换索引

C++ 在C+中填充数组+;不转换索引,c++,arrays,pointers,syntax,padding,C++,Arrays,Pointers,Syntax,Padding,以下是我所拥有的: int t[MX]; 现在,我想重写该代码,以便有效地将单个元素添加到该数组的开头,而不必在其余代码中将所有索引转换为1。该问题的解决方案可能如下: int _t[MX+1]; int * const t = _t+1; #define MX 1000 typedef int arr_mx[MX]; int _t[MX+1]; arr_mx &t = *((arr_mx*)(&_t[1])); 这种方法的问题是,现在这样的方法不再有效: memset

以下是我所拥有的:

int t[MX];
现在,我想重写该代码,以便有效地将单个元素添加到该数组的开头,而不必在其余代码中将所有索引转换为1。该问题的解决方案可能如下:

int _t[MX+1];
int * const t = _t+1;
#define MX 1000

typedef int arr_mx[MX];

int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));
这种方法的问题是,现在这样的方法不再有效:

memset(t, 0, sizeof t);
问题是
sizeof t
返回4,而不是我希望的MX*4

一种可能的解决办法可能是:

struct
{
    int a;
    int b[MX];
} _t;
int (&t)[MX] = _t.b;
但我觉得这很不雅观,也不令人满意。 因此,我的问题是:
有更好的方法吗?

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

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

sizeof
问题的解决方案可以通过以下方法构建:制作一个封装数组的模板类,并在其下标操作符内进行索引转换

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

int _t[MX+1];
int * const t = _t+1;
#define MX 1000

typedef int arr_mx[MX];

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

这是一个。

为什么要在
std::vector上使用它呢?
?除了那一小部分代码之外,我不想重写任何东西。我希望代码尽可能简单,而不是像那样引入一些繁重的类。不管怎样,我真的不知道这有什么帮助。然后你应该把它标记为“C”——这里没有多少C++。顺便说一下,<代码> STD::vector < /Cuff> Hug?@ USE2081465学习标准C++库的容器。@ ZDavaVojjkoic <代码> int(&t)[Mx]=τ.b;<代码>我相信在C语言中是不可能的,因为这是一个引用。我希望解决方案尽可能简单、简短和高效,这就是我不想使用stl的原因。谢谢你的回答。我还必须实现一个到
int*
的转换操作符,使其与现有代码完全兼容。通过这种方式,它可以在
memset
中正常工作,只需将所有值设置为任意值,包括带有“index”-1的值。问题是,到
int*
的转换必须返回指向元素-1的指针,否则
memset
将尝试设置最后一个元素之后的第一个元素的值,因为
sizeof
运算符不能重载,必须返回整个对象的大小。现在,期望得到指向数组元素0的指针的函数将得到-1。@toi333运算符
int*
应该返回未翻译的地址。只有运算符
int&[]
应该返回翻译后的值。这样,您的
memset
就能够用零填充缓冲区,而不会超过缓冲区的末尾。需要转换指针的函数应该使用
&t[0]
而不是
(int*)t
来获取转换地址。我就是这样实现的。不幸的是,正如您最后所建议的,我不能这样做,因为这需要重写代码的其他部分
t
本身应该可以隐式地强制转换为
int*
元素0(实际数组中的索引1)。非常好,这是完美的!谢谢!