我有数组:int i[20][30]
。什么是最快的方法,使int**
指针上使用它?
我的朋友刚刚写了一个函数,它使用相同大小的数组,我的函数是指针,我需要传递他的数据。
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 i[20][30]
更改为int **
,除非手动查看数据并构建它。
但是,c++中的每个xD数组都是一个1D数组,以某种复杂的方式访问成员。
的例子:
#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;
你不能有一个直接指向该数组的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)。这是非常快的,但是如果函数需要使用原始维度对数组进行操作,这将不起作用(因为它不是指针数组)。