&array [0] ==(void *)&array是否保证为真?

时间:2018-11-11 17:06:42

标签: c++ arrays

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

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

我的怀疑是由以下事实引起的:如果不将其强制转换为void *,则使用该模板的代码将无法编译(错误消息:“ static_cast from'int 'to'int()[ 10]'“”。

先谢谢了。这是代码:

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

1 个答案:

答案 0 :(得分:0)

是的,数组的地址与数组的第一个元素的地址相同(,在数组的开头没有填充),并强制转换为{{1} }不会更改地址,因此您的代码可以执行正确的操作。但是,将其编写如下更简单:

void*