【问题标题】:Is it possible to reinterpret pointer as dimensioned array reference?是否可以将指针重新解释为维度数组引用?
【发布时间】:2010-04-14 13:06:29
【问题描述】:

假设我有一些指针,我想将其重新解释为静态维度数组引用:

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]

有可能吗? 我该怎么做?

【问题讨论】:

    标签: c++ arrays reference


    【解决方案1】:

    很丑:

    double arr[4];
    double* d = arr;
    
    double (&a)[4] = *static_cast<double(*)[4]>(static_cast<void*>(d));
    

    确保数组类型与指针的原始来源相匹配。

    【讨论】:

    • double(*)[4],这是什么构造?这是我第一次看到它
    • 最后一个问题,为什么要先转换为 void*?
    • @aaa:我们可以这样做:reinterpret_cast&lt;double(*)[4]&gt;(d),但这依赖于实现定义的行为。 C++ 标准保证从void*T* 的转换将始终有效,只要void* 最初指向T。上面的代码格式正确,因为d 在转换为void* 时确实指向我们要转换的原始类型。 (这也是为什么我警告强制转换与指针指向的完全匹配的原因。如果我们要强制转换为其他任何东西,我们会有未定义的行为。)
    • 如果 d 最初是 new double[],而不是指向 double[4] 的指针会怎样? a 是否仍然有效(在前四个元素中)?我不太清楚 T 类型是指 double 还是 double[4]。谢谢
    • 我一直认为reinterpret_cast&lt;T&amp;&gt;(p)*reinterpret_cast&lt;T*&gt;(p) 相同,但我想评论一下,因为reinterpret_cast 是实现定义的,所以这并不总是正确的。这是一个很好的例子,因为在我的系统上使用 GCC 4.7 进行编译时,对引用的强制转换给出了一个地址,该地址与取消引用的强制转换为指针有 8 个字节的偏移量。转换为指针、转换为类型、取消引用路由更冗长但绝对更安全。
    【解决方案2】:
    double *array;
    ...
    ...
    int sizearray = sizeof(array)/sizeof(double);
    

    【讨论】:

    • 这里的逻辑是错误的。 array 没有关于它所指向的信息。无论如何,这将始终返回相同的答案。
    • sizeof(array) 当数组是一个指针时,将返回指针大小,通常为 4 或更大,具体取决于操作系统。
    【解决方案3】:

    是的,它被称为vector :)

    std::vector<double> myVariableArray(4)
    

    编辑:重读,看起来您想要获取声明数组的大小。你不能这样做——这是你偶尔可以使用的模板方法特性。因为double * 甚至不需要指向doubles,所以编译器无论如何都无法给你一个合理的答案。

    【讨论】:

    • @GMan:是的——刚刚意识到这一点。已编辑。最初解释为“我可以创建一个在运行时已知维度的数组吗”
    猜你喜欢
    • 2014-04-12
    • 2023-01-01
    • 2018-01-03
    • 2022-08-02
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多