C++ 指向指针的二维数组

C++ 指向指针的二维数组,c++,pointers,multidimensional-array,C++,Pointers,Multidimensional Array,我有一个数组:intI[20][30]。制作int**指针的最快方法是什么 我的朋友刚刚编写了一个使用相同大小数组的函数,我的函数在指针上,我需要传递他的数据。inta[20][30];//数据作为二维数组 int a[20][30]; // data as 2D array int *ap[20]; // array of pointers for (j = 0; j < 20; ++j) ap[j] = a[j]; // convert arr

我有一个数组:int
I[20][30]
。制作
int**
指针的最快方法是什么

我的朋友刚刚编写了一个使用相同大小数组的函数,我的函数在指针上,我需要传递他的数据。

inta[20][30];//数据作为二维数组
int a[20][30];       // data as 2D array
int *ap[20];         // array of pointers
for (j = 0; j < 20; ++j)
    ap[j] = a[j];    // convert array to pointers
// can now pass `ap` to function expecting `int **`...
int*ap[20];//指针数组 对于(j=0;j<20;++j) ap[j]=a[j];//将数组转换为指针 //现在可以将'ap'传递给预期为'int**'的函数。。。
您不能有一个直接指向该数组的
int**
指针,它没有任何意义。如果要以内存块的形式访问阵列,只需使用:

int *p = (int *)i; // you can go to up (p + 20*30)
否则,您需要一个指向
int[30]
数组的指针,即

int (*p)[30] = &i[0]; // points to first row
对于第一个,由于强制转换,您可以定义:

int **p2 = &p;

您可以使用
*(*p2+n)
访问阵列。您已经舍弃了数组维度,但只要在指针计算中使用它们,它们都是有效的,即
*(*p2+35)
引用第2行第6列(一行30,加上下一行的元素5)。这非常快,但是如果函数需要使用原始维度对数组进行操作,这将不起作用(因为它不是指针数组)。

您不能将
int i[20][30]
更改为
int**
,除非手动检查数据并构建它。
但是,可能会帮助你,C++中的每个xd数组只是一个一维数组,它以某种复杂的方式访问成员。 例如:

#define MaxX 20
#define MaxY 30
int i[MaxX][MaxY];
...
//When you write:
i[x][y] = something;
//It's actually been translate to:
i[x * MaxY + y] = something;

最快的方法就是不要。不管怎样,为什么不直接使用
std::array
?添加函数原型一个2d数组根本没有指针指向指针所期望的内存布局。@丹尼尔:谢谢-使用
i
作为数组名称让我的大脑糊涂了-现在已经修复了。为什么有人会对这个答案投反对票?有谁能更好地用
int[20][30]
创建一个函数,该函数需要
int**
?难道没有更快的方法吗?@oneat您要求在两个不兼容的东西之间进行转换。这种转换需要一些努力。我现在已经更改了上面的数组/指针名称,因为它有点混乱。