我是Java程序員,我很苦惱這個簡單的東西。如何返回這個多維數組?它是否必須返回一個**指針?我怎樣才能得到它在另一個文件?返回一個多維數組的指針
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
MoveDirection** get_ghost_moves() {
return ghost_moves;
}
我是Java程序員,我很苦惱這個簡單的東西。如何返回這個多維數組?它是否必須返回一個**指針?我怎樣才能得到它在另一個文件?返回一個多維數組的指針
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
MoveDirection** get_ghost_moves() {
return ghost_moves;
}
二維數組不是指向指針的指針。在C和C++中,數組和指針是基本不同的類型。一個數組衰變成爲一個指向其第一個元素的指針(因此兩者之間經常混淆),但它只在第一級衰減:如果你有一個多維數組,它衰變成一個指向數組的指針,而不是指針到一個指針。
的get_ghost_moves
適當聲明是將其聲明作爲指針返回的數組:
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
// Define get_ghost_moves to be a function returning "pointer to array 4 of MoveDirection"
MoveDirection (*get_ghost_moves())[4] {
return ghost_moves;
}
此語法語法是非常混亂的,所以我建議製作一個typedef它:
// Define MoveDirectionArray4 to be an alias for "array of 4 MoveDirections"
typedef MoveDirection MoveDirectionArray4[4];
MoveDirectionArray4 *get_ghost_moves() {
return ghost_moves;
}
ghost_moves
在存儲器中佔用的一組連續的GHOSTS_SIZE*4
MoveDirections:其相當於一個MoveDirection*
它不能與一個指向指針被使用,但用單一的指針。
如果你想使用兩個operator[]
-s索引你的數組你有兩個選擇:
使用類型的變量:MoveDirection (*ghost_moves) [GHOST_SIZE]
,然後就去做ghost_moves[i][j]
這主要是指針指針,通常不是一個好的解決方案:有ghost_moves
的類型MoveDirection**
例如:
MoveDirection ghost_moves_original[GHOST_SIZE][4];
MoveDirection *ghost_moves[GHOST_SIZE];
ghost_moves[0] = ghost_moves_original;
ghost_moves[1] = ghost_moves_original + GHOST_SIZE;
...
多維數組不是指針數組。它是一個單獨的內存塊。它只在聲明範圍內有意義。
你不能幹淨地返回,因爲你在這裏..你將不得不返回一個MoveDirection[GHOSTS_SIZE][4]
。
不,只需要一個*即可。關鍵是要考慮如何將數據排列在內存中:數組只是一系列相同類型的項目,並在內存中連續佈局。在這種情況下,數組的形狀和大小無關緊要 - 您只是返回一個指向其開頭的指針,這意味着您要返回第一個項目的地址。
當然,無論你返回那個指針,都必須知道數組的形狀和大小。
關於C和指針的好處之一是,一切都只是一個數字,內存只是一大堆字節。一旦你習慣了這樣的想法,這一切都會落到實處。
我相信你想要的以下內容:
MoveDirection (* get_ghost_moves()) [GHOSTS_SIZE][4];
在上面get_ghost_moves
是返回一個指向MoveDirection
陣列陣列的功能,具有尺寸GHOSTS_SIZE
和4
我找到了以下兩個網站對於瞭解如何理解C聲明非常有用:
#define MAX 20
char canopy[20][MAX];
typedef char frank[MAX];
frank friend[MAX];
frank *getList()
{
return friend;
}
void test(int n)
{
frank *list = getList();
int i;
for (i = 0; i < 5; i++)
{
printf("list[%d] %s\n\r", i, list[i]);
}
}
int main(void)
{
int i, nf;
for (i = 0; i < 5; i++)
{
snprintf(friend[i], MAX, "test%d", i);
printf("test[%d] %s \n\r", i, friend[i]);
}
test(5);
return 0;
}
事實上,`GHOSTS_SIZE * 4 *的sizeof(MoveDirection)`:) – 2010-12-06 23:09:09
GHOSTS_SIZE * 4個MoveDirections == GHOSTS_SIZE * 4 *的sizeof(MoveDirection)字節 – peoro 2010-12-06 23:09:44