在C ++中,C数组在语法上有点难以理解,并且可能需要一些时间来习惯。虽然1D数组衰减为指针:
void fn1(int x[2]) {}
void fn2(int*x) {}
fn1()
和fn2()
具有相同的功能签名。
数组实际上的类型包含数组中的元素数量。如:
void fn(int (&)[2]) {}
fn()
只接受2个元素的int数组。
事实是,我只能看到固定数量元素的数组只能通过堆栈,文件范围或具有该签名的结构/类分配生成:
int twoElementArray[2];
如果我要在堆上动态分配它,我似乎无法获得相同的签名。我以为我可能会施展它,但没有成功:
int (&array)[2] = reinterpret_cast<int(&)[2]>(new int[2]); // FAIL!
关于如何实现这一点的任何想法?
编辑:虽然我选择了一个答案,但它实际上并没有投出任何东西,但是使用了一种绝对更好的方法然后进行投射(如果不是必需的IMO,最好不要施放)。但是,它在技术上没有回答这个问题,因为问题是否有“一种指向数组类型的指针?”答案是肯定的。
int (&array)[2] = *reinterpret_cast<int(*)[2]>(new int[2]); // SUCCESS!
请注意,我不一定建议这样做,但它确实回答了这个问题。如果我需要将指针转换为数组类型,那将是如何做到的。使用operator new[]
时,请阅读所选答案以获得更好的解决方案。
答案 0 :(得分:9)
如果我理解你的问题,你会想做这样的事情:
// allocate an array of one int[2] dynamically
// and store a pointer to it
int(*p)[2] = new int[1][2];
// now initialize a reference to it
int(&array)[2] = *p;
// delete the array once you no longer need it
delete[] p;
答案 1 :(得分:1)
我认为这就是你要找的东西。对于堆,二维数组int[M][N]
衰减到int(*)[N]
。要通过引用传递它,请取消引用它(请参阅下面的m
):
#include <iostream>
using namespace std;
void func(int (&x)[2])
{
cout << x[0] << ' ' << x[1] << endl;
}
int main()
{
// on the heap
auto m = new int[1][2];
m[0][0] = 1; m[0][1] = 2;
auto n = new int[1][3];
n[0][0] = 4; n[0][1] = 5; n[0][2] = 6;
// on the stack
int o[2] = {7,8};
int p[3] = {9,10};
func(*m);
//func(*n); // doesn't compile, wrong size
func(o);
//func(p); // doesn't compile, wrong size
}
输出:
1 2
7 8
答案 2 :(得分:-1)
根据Mark回答,这可能会更好:
template <typename T>
void func(const T &x)
{
cout << x[0] << ' ' << x[1] << endl;
}
唯一不好的想法是这段代码是有效的:
cout << x[3] << endl;