2013-03-12 101 views
2

我有数组:int i[20][30]。使用int**指针的最快方法是什么?二维数组指针

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

+4

最快的方法是不要。无论如何,为什么不使用'std :: array'呢? – Fanael 2013-03-12 13:37:56

+0

添加函数原型 – uba 2013-03-12 13:40:13

+2

二维数组根本没有与指针所期望的指针相同的内存布局。 – 2013-03-12 13:42:34

回答

2
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 **`... 
+1

@Daniel:谢谢 - 数组名称的'i'使我的大脑混乱 - 现在已经修复。 – 2013-03-12 13:41:01

+1

为什么会低调回答这个问题?有没有人有一个更好的主意,使一个函数期待一个'int **'和'int [20] [30]'? – 2013-03-12 13:42:53

+0

没有更快的方法吗? – oneat 2013-03-12 13:43:05

0

不能直接有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)。这非常快,但是如果函数需要使用原始尺寸对数组进行操作,则这不起作用(因为它不是指针数组)。

0

你不能改变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;