C++中的C数组在语法上有些难以理解,需要花费一些时间去适应。尽管一个一维数组会衰变为一个指针:
void fn1(int x[2]) {}
void fn2(int*x) {}
fn1()
和fn2()
具有相同的函数签名。
实际上,数组确实有一种类型,其中包括数组中有多少个元素,例如:
void fn(int (&)[2]) {}
fn()
只会接受一个包含2个整数元素的数组。
问题在于,我只能看到带有该签名的堆栈、文件作用域或结构/类分配生成的固定元素数量的数组:
int twoElementArray[2];
如果我要在堆上动态分配它,似乎无法获得相同的签名。我想我可能可以进行类型转换,但没有成功:
int (&array)[2] = reinterpret_cast<int(&)[2]>(new int[2]); // FAIL!
有没有任何想法可以实现这一点(如果可能的话)?编辑:虽然我选择了一个答案,但它实际上并没有进行任何强制转换,而是使用了一种绝对更好的方法来进行操作(在我看来,如果不需要强制转换,最好不要进行强制转换)。但是,从技术上讲,它并没有回答问题,因为问题问是否“有一种将指针强制转换为数组类型的方法?” 答案是肯定的。
int (&array)[2] = *reinterpret_cast<int(*)[2]>(new int[2]); // SUCCESS!
请注意,我不一定推荐这样做,但它确实回答了问题。如果我需要将指针转换为数组类型,那么就应该这样做。阅读选定的答案,了解在使用operator new[]
时更好的解决方案。
fn1()
是我对于C++数组工作原理的解释中的一部分,面向那些不熟悉该语言的人。是的,我可以这样写:void fn3(int* array, size_t FIXED_SIZE) {}
或者另外这样写:void fn3(int[] array, size_t FIXED_SIZE) {}
这是一个普遍的解决方法。然而,我试图利用类型系统防止数组与其大小脱钩。 - Adrian