我想找一个通过指针恢复对数组的引用的方法。
请看这段代码。
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???
如果我绝对确定数组的大小,使用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: 如果数组中包含一个复杂的对象,有继承、虚拟函数等,它能行吗?会是一个可靠的解决方案吗?
你必须要投掷。
int(&arr_ref2)[rows][cols] = (int(&)[rows][cols])some_ptr;
当你声明指针 int* some_ptr = &arr[0][0];
你正在声明一个指向数组中第一个int的指针:指向一个int的指针。所以你必须把指针投回到数组中,并且不要引用指针(用 *some_ptr
).