Скажем, у нас есть 2D-массив int
:
int a[3][4] = { { 1,3,2,4 }, { 2,1,5,3 }, { 0,8,2,3 } };
Является ли он законным и действительным, чтобы принять его адрес и переосмыслить его как указатель на 1D массив int
s? В принципе:
int *p = reinterpret_cast<int *>(&a);
Чтобы я мог делать что-то вроде (грубо):
template<typename T, size_t X, size_t Y>
void sort2(T(&arr)[X][Y])
{
T *p = reinterpret_cast<T *>(&arr);
std::sort(p, p + X*Y);
}
ДЕМО: https://ideone.com/tlm190
Насколько я знаю, стандарт гарантирует, что выравнивание 2D-массива будет смежным в памяти, и хотя p + X*Y
технически выходит за пределы диапазона, никогда не открывается, поэтому не должно приводить к неопределенному поведению.
Могу ли я полностью обрабатывать 2D-массивы как 1D-массивы, когда это необходимо?