通过指针恢复对数组的引用。到底是不是UB?

问题描述 投票:1回答:1

我想找一个通过指针恢复对数组的引用的方法。

请看这段代码。

const int rows = 2;
const int cols = 3;
int arr[rows][cols] = { {1,2,3}, {4,5,6} }; // step0

int(&arr_ref)[rows][cols] = arr; // create a a reference from array - OK

int* some_ptr = &arr[0][0]; // step1. create pointer to array - OK

//int(&arr_ref2)[rows][cols] = *some_ptr; // step2 (failed). restore the array reference from the pointer. impossible.

int(&arr_ref3)[rows][cols] = reinterpret_cast<int(&)[rows][cols]>(*some_ptr); // step2. ok???
  • step0: 我们有一些数组
  • 步骤1:从数组中创建一个简单的指针。
  • step2:从指针中恢复引用。如何正确地做呢?

如果我绝对确定数组的大小,使用reinterpret_cast是否会导致某种未定义的行为。

再难一点。如果我们想得到一个不同大小和 "形状 "的数组,但它肯定是在原始数组的边界内。下面的代码是否 "合法"?

int arr2[6] = { 1,2,3,4,5,6 };
int* some_ptr2 = &arr2[0];
int(&arr2_ref)[2][2] = reinterpret_cast<int(&)[2][2]>(*some_ptr2); // ok???

UPD: 如果数组中包含一个复杂的对象,有继承、虚拟函数等,它能行吗?会是一个可靠的解决方案吗?

c++ pointers reference
1个回答
2
投票

你必须要投掷。

int(&arr_ref2)[rows][cols] = (int(&)[rows][cols])some_ptr;

当你声明指针 int* some_ptr = &arr[0][0]; 你正在声明一个指向数组中第一个int的指针:指向一个int的指针。所以你必须把指针投回到数组中,并且不要引用指针(用 *some_ptr).

© www.soinside.com 2019 - 2024. All rights reserved.