2010-12-06 62 views
4

我是Java程序員,我很苦惱這個簡單的東西。如何返回這個多維數組?它是否必須返回一個**指針?我怎樣才能得到它在另一個文件?返回一個多維數組的指針

static MoveDirection ghost_moves[GHOSTS_SIZE][4]; 

MoveDirection** get_ghost_moves() { 
    return ghost_moves; 
} 

回答

5

二維數組不是指向指針的指針。在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; 
} 
0

ghost_moves在存儲器中佔用的一組連續的GHOSTS_SIZE*4 MoveDirections:其相當於一個MoveDirection*

它不能與一個指向指針被使用,但用單一的指針。


如果你想使用兩個operator[] -s索引你的數組你有兩個選擇:

  1. 使用類型的變量:MoveDirection (*ghost_moves) [GHOST_SIZE],然後就去做ghost_moves[i][j]

  2. 這主要是指針指針,通常不是一個好的解決方案:有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; 
    ... 
    
+1

事實上,`GHOSTS_SIZE * 4 *的sizeof(MoveDirection)`:) – 2010-12-06 23:09:09

+0

GHOSTS_SIZE * 4個MoveDirections == GHOSTS_SIZE * 4 *的sizeof(MoveDirection)字節 – peoro 2010-12-06 23:09:44

0

多維數組不是指針數組。它是一個單獨的內存塊。它只在聲明範圍內有意義。

你不能幹淨地返回,因爲你在這裏..你將不得不返回一個MoveDirection[GHOSTS_SIZE][4]

2

不,只需要一個*即可。關鍵是要考慮如何將數據排列在內存中:數組只是一系列相同類型的項目,並在內存中連續佈局。在這種情況下,數組的形狀和大小無關緊要 - 您只是返回一個指向其開頭的指針,這意味着您要返回第一個項目的地址。

當然,無論你返回那個指針,都必須知道數組的形狀和大小。

關於C和指針的好處之一是,一切都只是一個數字,內存只是一大堆字節。一旦你習慣了這樣的想法,這一切都會落到實處。

3

我相信你想要的以下內容:

MoveDirection (* get_ghost_moves()) [GHOSTS_SIZE][4]; 

在上面get_ghost_moves是返回一個指向MoveDirection陣列陣列的功能,具有尺寸GHOSTS_SIZE和4

我找到了以下兩個網站對於瞭解如何理解C聲明非常有用:

3
#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; 
}