2012-12-23 91 views
8

可能重複:
Passing a pointer representing a 2D array to a function in C++如何通過指針在C傳遞一個二維數組

我試圖通過指向我的2維數組傳遞給函數要修改價值。

#include <stdio.h> 

void func(int **ptr); 

int main() { 
    int array[2][2] = { 
     {2, 5}, {3, 6} 
    }; 

    func(array); 

    printf("%d", array[0][0]); 
    getch(); 
} 

void func(int **ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i][j] = 8; 
     } 
    } 
} 

但是程序崩潰了。我做錯了什麼?

+2

使用適當的類型,'無效FUNC(INT( * ptr)[2])',或者傳遞一個指針數組。 –

+0

[我如何在C++中使用數組?](http://stackoverflow.com/q/4810664/1202636) – effeffe

+0

數組不是指針。指針不是數組。你做錯了沒有對你自己重複,直到你不再懷疑它。 –

回答

3

它崩潰是因爲數組不是指向指針的指針,它會嘗試讀取數組值,就像它們是指針一樣,但數組只包含沒有指針的數據。
數組是內存中的所有相鄰,只接受單一指針和調用函數時做了轉換:

func((int*)array); 

...

void func(int *ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i+j*2]=8; 
     } 
    } 
} 
+0

謝謝。你讓我今天一整天都感覺很好。但如何設置我和j,如果我想在數組中存儲不同的東西? –

+0

我還沒有明白你的意思。 –

9

您的數組的類型爲int[2][2](「2個數組的2個整數」),其名稱將衰減爲指向其第一個元素的指針,該元素的類型爲int(*)[2](「指向2個int的數組的指針」)。所以你func需要採取這種類型的參數:

void func(int (*ptr)[2]); 
// equivalently: 
// void func(int ptr[][2]); 

或者,你可以取到數組類型(「參考2陣列2的int數組」)參考:

void func(int (&ptr)[2][2]); 

確保您更改了聲明和定義。