2013-03-12 102 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;