Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++_Arrays_Reference - Fatal编程技术网

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*>代码>到 T*< /C> >,只要<>代码> Vux*/COD>总是指向“<代码> t>代码>,就可以正常工作。上面的代码格式很好,因为当将
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);