C++ 是否可以将指针重新解释为维度数组引用?
假设我有一些指针,我想将其重新解释为静态维度数组引用:C++ 是否可以将指针重新解释为维度数组引用?,c++,arrays,reference,C++,Arrays,Reference,假设我有一些指针,我想将其重新解释为静态维度数组引用: double *p; double (&r)[4] = ?(p); // some construct? // clarify template< size_t N> void function(double (&a)[N]); ... double *p; function(p); // this will not work. // I would like to cast p as to make it
double *p;
double (&r)[4] = ?(p); // some construct?
// clarify
template< size_t N> void function(double (&a)[N]);
...
double *p;
function(p); // this will not work.
// I would like to cast p as to make it appear as double[N]
double*p;
双(&r)[4]=?(p);//一些构造?
//澄清
模板空函数(双(&a)[N]);
...
双*p;
函数(p);//这是行不通的。
//我想将p转换为双精度[N]
有可能吗?
我该怎么做?是的,它被称为
向量(
:)
std::向量myVariableArray(4)
编辑:重新阅读,看起来您想要获取声明数组的大小。你不能那样做--这是一个模板方法特性,你可以偶尔使用。由于
double*
甚至不需要指向double
s,因此编译器在任何情况下都无法给出合理的答案。这很难看:
double arr[4];
double* d = arr;
double (&a)[4] = *static_cast<double(*)[4]>(static_cast<void*>(d));
double-arr[4];
双*d=arr;
双(&a)[4]=*静态施法(静态施法(d));
确保数组类型与指针最初的来源相匹配。@GMan:是的——刚刚意识到这一点。编辑。最初解释为“我可以用运行时已知的维度创建数组吗”
double(*)[4]
,这个构造是什么?这是我第一次看到最后一个问题,为什么要先强制转换为void*呢?@aaa:我们可以这样做:重新解释强制转换(d)
,但这取决于实现定义的行为。C++标准保证了从<代码> Value*>代码>到d
转换为void*
时,确实指向了我们正在转换的原始类型。(这也是我警告强制转换与指针指向的完全匹配的原因。如果我们要强制转换到其他对象,我们将有未定义的行为。)如果d最初是新的双精度[],而不是指向双精度[4]的指针,会怎么样?a
是否仍然有效(在前四个元素中)?我不太清楚你所说的“T”是指双倍还是double[4]
。谢谢,我一直认为,reinterpret\u cast(p)
将与*reinterpret\u cast(p)
相同,但我想说的是,由于reinterpret\u cast是由实现定义的,所以这并不总是正确的。这是一个很好的例子,因为在我的系统上使用GCC4.7进行编译时,转换到引用的地址与取消引用的转换到指针的地址偏移了8字节。强制转换到指针、强制转换到类型、取消引用路由更详细,但绝对更安全。这里的逻辑是错误的<代码>数组不包含有关它指向的内容的信息。这将始终返回相同的答案,无论是什么。当数组是指针时,sizeof(array)将返回指针大小,通常为4或更多,具体取决于操作系统。
double *array;
...
...
int sizearray = sizeof(array)/sizeof(double);
double *array;
...
...
int sizearray = sizeof(array)/sizeof(double);