如果我有這樣的數組:得到的指針的元素在二維數組
#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]
)?
如果我有這樣的數組:得到的指針的元素在二維數組
#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]
)?
如何:
return & foo[i][j];
你的方法是錯誤的:
*foo + i * b + j
這解引用指針foo
,並添加東西的價值。你想要的是:
foo + i * b + j
而且,由於索引符號也取消引用指針,則必須再次引用它:
&foo[i][j]
的方法爲我工作: http://codepad.org/C7ytCw8J – Tyilo
當然:'foo'是指向int指針的指針,所以在解引用時,它仍然是一個指向int的指針。 )仍然這個鍵盤是錯誤的:你不應該玩'[a] [b]';只有'[0..a-1] [0..b-1]'值在範圍內。 ) – raina77ow
@ 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'起作用。 –
這幾乎是太容易了...... – Tyilo