首页 > 解决方案 > &array[0]==(void*)&array 是否保证为真?

问题描述

指向任意数组的指针是否等于指向 void* 后数组第一个元素的指针,并且独立于编译器?

我需要一个模板函数,它接受一个指向数组的指针array[0]并提供对数组的引用。下面的代码完成了这项工作(至少在 gcc 和 clang 中),我想知道这是否是合法的 C++ 代码。

我的怀疑是由于没有强制转换为 void* 使用模板的代码将无法编译(错误消息:``static_cast from 'int ' to 'int ( )[10]' is not allowed")。

提前致谢。这是代码:

template <std::size_t n,  typename T>
inline T (& p2a( T * ptr))[n]
{  
  return *static_cast<T(*)[n]>( static_cast<void*>(ptr) );
}

标签: c++arrays

解决方案


是的,数组的地址与数组的第一个元素的地址相同(即,数组的开头没有填充)并且强制转换void*不会改变地址,所以你的代码做正确的事. 但是,更直接的写法如下:

template <std::size_t n,  typename T>
inline auto p2a(T* ptr) {
    return reinterpret_cast<T(&)[N]>(*ptr);
}

推荐阅读