2012-11-22 37 views
2

如果我有這樣的數組:得到的指針的元素在二維數組

#define a 10 
#define b 20 

int foo[a][b]; 

我能得到的指針foo[i][j]這樣的:

int *pointerToElement(i, j) 
{ 
    return *foo + i * b + j; 
} 

是不是有一個使用索引符號更容易的方法(*foo[i][j])?

回答

4

如何:

return & foo[i][j]; 
+0

這幾乎是太容易了...... – Tyilo

2

你的方法是錯誤的:

*foo + i * b + j 

這解引用指針foo,並添加東西的價值。你想要的是:

foo + i * b + j 

而且,由於索引符號也取消引用指針,則必須再次引用它:

&foo[i][j] 
+0

的方法爲我工作: http://codepad.org/C7ytCw8J – Tyilo

+1

當然:'foo'是指向int指針的指針,所以在解引用時,它仍然是一個指向int的指針。 )仍然這個鍵盤是錯誤的:你不應該玩'[a] [b]';只有'[0..a-1] [0..b-1]'值在範圍內。 ) – raina77ow

+1

@ raina77ow不,'foo'是一個int [10] [20]',而不是'int **',並衰變爲一個'int(*)[20]',一個指向20個數組的指針' int',在大多數情況下。因此'foo + i * b + j'會在第一個字節之後的((* *)如果'a'足夠大(它不是,除非'i == 0'和'j'足夠小,或者其中一個具有適當的幅度爲負數,那麼'foo'所以這個加法一般會調用未定義的行爲)。另一方面,'* foo'是一個'int [20]',並且在大多數情況下會衰變爲一個'int *',所以'* foo + i * b + j'起作用。 –